2017-05-26 27 views
1

.NET標準的承諾是爲一個版本編寫的任何內容都適用於將來的版本。有條件編譯.NET的最低版本

現在我可以有條件地編譯東西,例如

#if NETSTANDARD1_3 
// do things 
#elif NETSTANDARD1_4 || NETSTANDARD2_0 || NET45 
// do other things 
#endif 

但對我來說,這似乎具有很差的可擴展性,因爲如果我決定在未來添加新的目標,例如,對於.NET Standard 2.1,我必須在有這些條件的地方去更新它。

我希望做的是一樣的東西:

#if NETSTANDARD1_3 
// do things 
#elif NETSTANDARD1_4_OR_GREATER || NET45_OR_GREATER 
// do other things 
#endif 

我目前的解決方案是創建這些_OR_GREATER手動定義在我的項目文件。這至少使我的維護到一個單一的文件,而不是每個源文件:

<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' "> 
    <DefineConstants>NETSTANDARD1_4_OR_GREATER;$(DefineConstants)</DefineConstants> 
</PropertyGroup> 

不過,我很好奇,如果這已經佔到了其他一些更標準的方式。這是一件事嗎?

+0

誰downvoted的問題,頭腦解釋爲什麼? –

+0

我認爲這個問題是有效的,但可能需要一些改寫,說明意圖 - 最低版本的DefineConstant。 –

+0

(哦,這不是我,我upvoted,因爲我覺得這非常有用) –

回答

3

這是可能的幾個msbuild技巧。 SDK目標(隱式導入項目SDK="…"屬性<Project/>)將TargetFramework屬性拆分爲TargetFrameworkIdentifierTargetFrameworkVersion

所以<TargetFramework>netstandard1.5</…>會導致:

  • $(TargetFrameworkIdentifier).NETStandard
  • $(TargetFrameworkVersion)v1.5
  • $(_ TargetFrameworkVersionWithoutV)1.5,但這個屬性是按照慣例(下劃線) 「私人」,並且不應因爲它可能會改變/不保證可以被自定義目標使用。

比較字符串時,MSBuild試圖在比較之前將它們解析爲版本,因此我們可以比較'1.5' >= '1.4'。使用這種 ,我們可以掛鉤一個目標的編譯過程之前設置基於版本範圍自定義變量:

<Target Name="AddNetStdMinDefine" 
     BeforeTargets="CoreCompile" 
     Condition="('$(TargetFrameworkIdentifier)' == '.NETStandard' and '$(TargetFrameworkVersion.Substring(1))' &gt;= '1.4')"> 
    <PropertyGroup> 
    <DefineConstants>$(DefineConstants);IS_MIN_NETSTANDARD1_4</DefineConstants> 
    </PropertyGroup> 
</Target>