MsBuild 15中的每条TargetFramework条件

时间:2017-03-12 22:46:04

标签: .net msbuild .net-core

使用新的MsBuild版本,很容易在.csproj项目中定位多个框架和框架版本:

<TargetFrameworks>net40;net45;net461;netcoreapp1.1</TargetFrameworks>

现在,我如何获得为每个代码定义的常量,以便我可以将某些代码仅作为例如netcoreapp1.1传递而不是完整的框架编译?

我希望能够像这样添加一个预处理器指令:

#if NET_CORE
    // some code
#endif

对于完整的.NET Framework和可能的.NET标准也一样。

我发现的其他问题并未采用新的<TargetFrameworks>方法将框架定义为帐户。像这样的东西不起作用:

<DefineConstants Condition=" '$(TargetFramework)' == '.NETCoreApp' ">NET_CORE</DefineConstants>

1 个答案:

答案 0 :(得分:9)

您已经定义了可以使用的各种预处理器符号。来自docs

.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 Framework 4.7   --> NET47
.NET Framework 4.7.1 --> NET471
.NET Framework 4.7.2 --> NET472

.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
.NET Standard 2.0    --> NETSTANDARD2_0

.Net Core 1.0        --> NETCOREAPP1_0
.Net Core 1.1        --> NETCOREAPP1_1
.Net Core 2.0        --> NETCOREAPP2_0
.Net Core 2.1        --> NETCOREAPP2_1

例如:

#if NETSTANDARD1_6
    Console.WriteLine("This is .Net Standard 1.6");
#endif

#if NETCOREAPP2_0
    Console.WriteLine("This is .Net Core 2.0");
#endif