Как установить .NET Core в инструкции #if для компиляции
Я создаю многосердечный проект. Я использую что-то вроде этого:
#if NET40
Console.WriteLine("hello from net 4");
#endif
Но я не могу найти шаблон для .NET Core. Я пробовал:
#if NETCOREAPP1.0
Console.WriteLine("hello from net Core");
#endif
но это неверный оператор.
Спасибо.
Ответы
Ответ 1
Используйте NETCOREAPP1_0
или более resent NETCOREAPP1_1
и NETCOREAPP2_0
В статье https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries содержится список для разных символов препроцессора.
.NET Framework 2.0: NET20
.NET Framework 3.5: NET35
.NET Framework 4.0: NET40
.NET Framework 4.5 → NET45
.NET Framework 4.5.1 → NET451
.NET Framework 4.5.2 → NET452
.NET Framework 4.6 → NET46
.NET Framework 4.6.1 → NET461
.NET Framework 4.6.2 → NET462
. NET Standard 1.0 → NETSTANDARD1_0
.NET Standard 1.1 → NETSTANDARD1_1
.NET Standard 1.2 → NETSTANDARD1_2
.NET Standard 1.3 → NETSTANDARD1_3
.NET Standard 1.4 → NETSTANDARD1_4
.NET Standard 1.5 → NETSTANDARD1_5
.NET Standard 1.6 → NETSTANDARD1_6
Ответ 2
Вы можете определить любые пользовательские условные символы компиляции следующим образом (project.json):
"frameworks": {
"net40": {
"buildOptions": {
"define": ["NET_40"]
}
},
"netstandard1.5": {
"buildOptions": {
"define": [ "NET_STANDARD" ]
}
}
}
Этот подход представляется более практичным, потому что вы можете использовать один и тот же условный символ для нескольких целей, без необходимости писать что-то вроде
#if NET20 && NET 40 && NET45
Ответ 3
В то время как ответ выше этого правилен, следует отметить, что в типе проекта .NET Core xproj существует ошибка. Когда вы определяете условный символ компиляции через настройки проекта, он определяет элемент как "определяет", но это неверно. Он должен создать элемент, называемый "define". Вы можете решить проблему, отредактировав файл project.json вручную.
Я зарегистрировал эту ошибку с Microsoft в двух местах. Пожалуйста, найдите время, чтобы зарегистрировать свою досаду с Microsoft, чтобы они в конечном итоге смогли ее исправить и не причинить этому горе другим.
В этом потоке есть подробное объяснение проблемы с шагами для воспроизведения и скриншотами: https://github.com/dotnet/cli/issues/4022#issuecomment-238777946
Это отчет об ошибке Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/2983351/conditional-compilation-symbols-broken-in-net-core-projects#tabs
Ответ 4
Для новой проектной системы Visual Studio 2017 csproj...
Здесь вы можете найти полный список доступных символов:
https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-multitarget
Вы можете создавать составные константы для вашего .csproj файла следующим образом:
<PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' ">
<DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
</PropertyGroup>
Затем вы можете использовать его в директиве компилятора #if
следующим образом:
#if FULLFRAMEWORK
private bool DoSomethingFullFrameworkSpecific()
{
var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
return connectionStringSetting != null;
}
#endif