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

问题描述 投票:23回答:5

我创建了一个多目标框架项目。我使用这样的东西:

  #if NET40
    Console.WriteLine("hello from net 4");
  #endif

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

   #if NETCOREAPP1.0
     Console.WriteLine("hello from net Core");
   #endif

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

c# asp.net-core asp.net-core-mvc .net-core asp.net-core-1.0
5个回答
39
投票

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

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


19
投票

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

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

<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>

用法:

#if NETFRAMEWORK
    FrameworkSpecific();
#endif

#if NETSTANDARD
    StandardSpecific();
#endif

#if NETCORE
    CoreSpecific();
#endif

10
投票

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

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

    }
}

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

#if NET20 && NET 40 && NET45

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

2
投票

虽然上面的答案是正确的,但应该注意.NET Core xproj项目类型中存在一个错误。通过项目设置定义条件编译符号时,它将元素定义为“定义”,但这是不正确的。它应该创建一个名为“define”的元素。您可以通过手动编辑project.json来解决此问题。

我在两个地方记录了这个与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

© www.soinside.com 2019 - 2024. All rights reserved.