Как установить .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