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

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

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

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

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

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

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

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

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

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

 #if NET20 && NET 40 && NET45 

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

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

  NETFRAMEWORK   NETSTANDARD   NETCORE  

用法:

 #if NETFRAMEWORK FrameworkSpecific(); #endif #if NETSTANDARD StandardSpecific(); #endif #if NETCORE CoreSpecific(); #endif 

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

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

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

   FULLFRAMEWORK;FULL  

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

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

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

我已经在两个地方记录了这个错误。 请花点时间向微软注册您的烦恼,以便他们最终能够解决这个问题并且不会让其他人感到悲伤。

这个post详细解释了重现步骤和截图的问题: 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