Dot-Net

MsBuild 15 中每個 TargetFramework 的條件

  • November 25, 2021

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

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

現在,我如何為它們中的每一個定義一個常量,以便我可以讓某些程式碼僅作為netcoreapp1.1pass 的一部分而不是完整的框架編譯?

我希望能夠添加一個像這樣的預處理器指令:

#if NET_CORE
   // some code
#endif

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

我發現的其他問題沒有考慮<TargetFrameworks>到定義框架的新方法。像這樣的東西不起作用:

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

已經定義了各種可以使用的預處理器符號。從文件

.NET 框架

.NET 標準

.NET 核心

.NET 5+

附加<framework>_OR_GREATER符號

從 .NET6 版本開始,<framework>_OR_GREATER添加了一組符號:

例如:

目標框架符號
.NET 框架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 標準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+(和 .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

引用自:https://stackoverflow.com/questions/42754123