2017-03-12 43 views
3

隨着新的MSBuild版本,它真的很容易針對多種框架和框架版本.csproj的項目:每TargetFramework條件中的MSBuild 15

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

現在,我如何才能爲他們每個人的這樣定義的常量我可以讓某些代碼成爲例如netcoreapp1.1傳遞並沒有完整的框架編譯?

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

#if NET_CORE 
    // some code 
#endif 

與同爲完整的.NET框架,並可能.NET標準。

我發現的其他問題不會採用新的<TargetFrameworks>將框架定義到帳戶中。像這樣的東西不起作用:

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

執行符號[這裏](https://docs.microsoft.com/en-us/dotnet/articles/core/tutorials/libraries )爲你工作? – DavidG

+0

嗯,.NET Core沒有,但我可以通過'#if NET40 || NET45 || NET461'和'#else'。謝謝@DavidG!您應該將其作爲答案發布,以便我可以接受它。 – MarcinJuraszek

+0

有關信息,他們現在添加了.Net Core的符號,請參閱我的更新回答:) – DavidG

回答

6

已經定義了各種可以使用的預處理器符號。從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 --> NET462 
.NET Framework 4.7.1 --> NET462 

.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 

例如:

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

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