MsBuild 15中的每条TargetFramework条件

Mar*_*zek 8 .net msbuild .net-core

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

<TargetFrameworks>net40;net45;net461;netcoreapp1.1</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

现在,我如何获得为每个定义的常量,以便我可以让某些代码只是例如netcoreapp1.1pass而不是完整框架编译的一部分?

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

#if NET_CORE
    // some code
#endif
Run Code Online (Sandbox Code Playgroud)

对于完整的.NET Framework和可能的.NET Standard也是如此.

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

<DefineConstants Condition=" '$(TargetFramework)' == '.NETCoreApp' ">NET_CORE</DefineConstants>
Run Code Online (Sandbox Code Playgroud)

Dav*_*idG 11

已经定义了可以使用的各种预处理器符号.来自文档:

.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
Run Code Online (Sandbox Code Playgroud)

例如:

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

#if NETCOREAPP2_0
    Console.WriteLine("This is .Net Core 2.0");
#endif
Run Code Online (Sandbox Code Playgroud)