如何在#if语句中设置.NET Core以进行编译

Ser*_*hur 30 c# asp.net-core-mvc .net-core asp.net-core asp.net-core-1.0

我创建了multy框架项目.我使用这样的东西:

  #if NET40
    Console.WriteLine("hello from net 4");
  #endif
Run Code Online (Sandbox Code Playgroud)

但是我找不到.NET Core的通配符.我试过了 :

   #if NETCOREAPP1.0
     Console.WriteLine("hello from net Core");
   #endif
Run Code Online (Sandbox Code Playgroud)

但这不是有效的声明.谢谢.

Ral*_*ing 46

你需要下划线_而不是点:

NETCOREAPP1_0或者更新的NETCOREAPP1_1NETCOREAPP2_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标准1.3 - > NETSTANDARD1_3

.NET Standard 1.4 - > NETSTANDARD1_4

.NET Standard 1.5 - > NETSTANDARD1_5

.NET Standard 1.6 - > NETSTANDARD1_6

  • 您可以定义`NETCOREAPP`和`NETSTANDARD`而不使用其版本。我测试了它并在VS2019中工作。 (2认同)

小智 22

扩展Devon对VS2017 .csproj文件的回答:

查看此处的表,您可以使用正则表达式轻松定义常量.因此,如果添加/更改目标框架,则无需考虑更新条件.

<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFramework)', '^net\d'))">
  <DefineConstants>NETFRAMEWORK</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFramework)', '^netstandard\d'))">
  <DefineConstants>NETSTANDARD</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(TargetFramework)', '^netcoreapp\d'))">
  <DefineConstants>NETCORE</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

用法:

#if NETFRAMEWORK
    FrameworkSpecific();
#endif

#if NETSTANDARD
    StandardSpecific();
#endif

#if NETCORE
    CoreSpecific();
#endif
Run Code Online (Sandbox Code Playgroud)

  • @gallivantor [好像现在是](https://github.com/dotnet/sdk/issues/2072)(除了.NET Core 的符号称为`NETCOREAPP`) (8认同)
  • 好主意; 遗憾的是,这些NETFRAMEWORK/NETSTANDARD/NETCORE符号不能作为编译器的标准部分使用 (4认同)
  • 您应该主要编写可以在任何地方运行的代码,而不依赖于编译器标志。这种方法仅适用于您真正需要它的极少数情况。 (2认同)

Vit*_*nko 11

您可以按以下方式定义任何自定义条件编译符号(project.json):

"frameworks": {
    "net40": {
      "buildOptions": {
        "define": ["NET_40"]
      }
    },
    "netstandard1.5": {
      "buildOptions": {
        "define": [ "NET_STANDARD" ]
      }

    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法似乎更实用,因为您可以对多个目标使用相同的条件符号,而无需编写类似的东西

#if NET20 && NET 40 && NET45
Run Code Online (Sandbox Code Playgroud)


Dev*_*iss 5

对于新的Visual Studio 2017 csproj项目系统...

您可以在此处找到可用符号的完整列表:https : //docs.microsoft.com/zh-cn/dotnet/core/tutorials/libraries#how-to-multitarget

您可以在.csproj文件中为其创建复合常量,如下所示:

  <PropertyGroup Condition="'$(TargetFramework)' == 'net451' Or '$(TargetFramework)' == 'net461' ">
    <DefineConstants>FULLFRAMEWORK;FULL</DefineConstants>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

然后,您可以在#if编译器指令中使用它,如下所示:

#if FULLFRAMEWORK
        private bool DoSomethingFullFrameworkSpecific()
        {
            var connectionStringSetting = ConfigurationManager.ConnectionStrings[connectionStringName];
            return connectionStringSetting != null;
        }
#endif
Run Code Online (Sandbox Code Playgroud)