【问题标题】:Conditional per TargetFramework in MsBuild 15MsBuild 15 中每个 TargetFramework 的条件
【发布时间】:2017-08-02 21:47:15
【问题描述】:

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

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

现在,我如何为它们中的每一个定义一个常量,以便我可以让某些代码仅作为例如的一部分。 netcoreapp1.1 通过而不是完整的框架编译?

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

#if NET_CORE
    // some code
#endif

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

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

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

【问题讨论】:

  • 符号here 对你有用吗?
  • 嗯,.NET Core 没有,但我可以通过 #if NET40 || NET45 || NET461#else 处理。谢谢@DavidG!您应该将其发布为答案,以便我接受。
  • 有关信息,他们现在为 .Net Core 添加了符号,请参阅我的更新答案:)

标签: .net msbuild .net-core


【解决方案1】:

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

.NET 框架

Framework/Version Symbol
.NET Framework (any version) NETFRAMEWORK
.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 Framework 4.8 NET48

.NET 标准

Framework/Version Symbol
.NET Standard (any version) NETSTANDARD
.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 Standard 2.1 NETSTANDARD2_1

.NET 核心

Framework/Version Symbol
.NET [Core] (any version) NETCOREAPP
.NET Core 1.0 NETCOREAPP1_0
.NET Core 1.1 NETCOREAPP1_1
.NET Core 2.0 NETCOREAPP2_0
.NET Core 2.1 NETCOREAPP2_1
.NET Core 2.2 NETCOREAPP2_2
.NET Core 3.0 NETCOREAPP3_0
.NET Core 3.1 NETCOREAPP3_1

.NET 5+

Framework/Version Symbol
.NET 5.0 NET5_0

其他 &lt;framework&gt;_OR_GREATER 符号

从 .NET6 版本开始,添加了一组 &lt;framework&gt;_OR_GREATER 符号:

例如:

Target Framework Symbols
.NET Framework NET48_OR_GREATER, NET472_OR_GREATER, NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, NET40_OR_GREATER, NET35_OR_GREATER, NET20_OR_GREATER
.NET Standard NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATER, NETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, NETSTANDARD1_1_OR_GREATER, NETSTANDARD1_0_OR_GREATER
.NET 5+ (and .NET Core) NET6_0_OR_GREATER, NET6_0_ANDROID_OR_GREATER, NET6_0_IOS_OR_GREATER, NET6_0_MACOS_OR_GREATER, NET6_0_MACCATALYST_OR_GREATER, NET6_0_TVOS_OR_GREATER, NET6_0_WINDOWS_OR_GREATER, NET5_0_OR_GREATER, NETCOREAPP_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATER, NETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATER, NETCOREAPP2_0_OR_GREATER, NETCOREAPP1_1_OR_GREATER, NETCOREAPP1_0_OR_GREATER
#if NETSTANDARD1_6
    Console.WriteLine("This is .Net Standard 1.6");
#endif

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

【讨论】:

  • 如果你不关心确切的版本,还有NETFRAMEWORKNETSTANDARDNETCOREAPP符号。
  • @JakubJanuszkiewicz 我相信它们是在 .NET Core 3.x 中添加的,终于可以添加它们(和 .NET 5!),谢谢。
  • 为什么不能在 C# 项目中定义这些符号? #if DEBUG#if !DEBUG 都有效,但上面列表中似乎没有定义。项目属性显示Target framework 设置为.NET Framework 4.7.2
猜你喜欢
  • 1970-01-01
  • 2023-01-29
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2017-08-07
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多