[c#] 條件編譯和框架目標


Answers

到目前為止,為我工作的另一種方法是將以下內容添加到項目文件中:

 <PropertyGroup>
    <DefineConstants Condition=" !$(DefineConstants.Contains(';NET')) ">$(DefineConstants);$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
    <DefineConstants Condition=" $(DefineConstants.Contains(';NET')) ">$(DefineConstants.Remove($(DefineConstants.LastIndexOf(";NET"))));$(TargetFrameworkVersion.Replace("v", "NET").Replace(".", ""))</DefineConstants>
  </PropertyGroup>

這取決於TargetFrameworkVersion屬性的值,它類似於“v3.5”,取代了“v”和“。”。 獲得“NET35”(使用新的屬性功能功能)。 然後它刪除任何現有的“NETxx”值並將其添加到DefinedConstants的末尾。 簡化這一點可能是可能的,但我沒有時間去搗鼓。

在VS中的項目屬性的Build選項卡上查看,您將在條件編譯符號部分中看到結果值。 在“應用程序”選項卡上更改目標框架版本,然後自動更改符號。 然後,您可以按照常規方式使用#if NETxx預處理器指令。 在VS中更改項目似乎不會丟失自定義PropertyGroup。

請注意,這似乎不會給你任何不同的客戶端配置文件目標選項,但這對我來說不是問題。

Question

如果目標框架是新版本,那麼我的項目的代碼可能會大幅度提高。 我希望能夠更好地利用C#中的條件編譯根據需要切換它們。

就像是:

#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif

有沒有這些符號是免費的? 我需要注入這些符號作為項目配置的一部分嗎? 看起來很容易,因為我知道哪些框架是從MSBuild定位的。

/p:DefineConstants="NET40"

更新:我的問題是人們如何處理這種情況? 你正在創建不同的配置? 你是通過命令行傳遞常量嗎?




@Azarien,你的答案可以和Jeremy's結合,而不是Debug | Release等。

對我而言,結合這兩種變體最適合,即包括使用#if NETXX的代碼條件,並且一次構建不同的框架版本。

我有這些在我的.csproj文件中:

  <PropertyGroup>
    <DefineConstants Condition=" '$(TargetFrameworkVersion.Replace(&quot;v&quot;,&quot;&quot;))' &gt;= '4.0' ">NET_40_OR_GREATER</DefineConstants>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(TargetFrameworkVersion.Replace(&quot;v&quot;,&quot;&quot;))' == '3.5' ">
    <DefineConstants>NET35</DefineConstants>
    <OutputPath>bin\$(Configuration)\$(TargetFrameworkVersion)</OutputPath>
  </PropertyGroup>

並在目標:

  <Target Name="AfterBuild">
    <MSBuild Condition=" '$(TargetFrameworkVersion.Replace(&quot;v&quot;,&quot;&quot;))' &gt;= '4.0' "
      Projects="$(MSBuildProjectFile)"
      Properties="TargetFrameworkVersion=v3.5"
      RunEachTargetSeparately="true"  />
  </Target>



從清除常量開始:

<PropertyGroup>
  <DefineConstants/>
</PropertyGroup>

接下來,建立你的調試,跟踪和其他常量,如:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  <DefineConstants>TRACE;DEBUG;$(DefineConstants)</DefineConstants>
</PropertyGroup>

最後,建立你的框架常量:

<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v2.0' ">
  <DefineConstants>NET10;NET20;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v3.0' ">
  <DefineConstants>NET10;NET20;NET30;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v3.5' ">
  <DefineConstants>NET10;NET20;NET30;NET35;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.0' ">
  <DefineConstants>NET10;NET20;NET30;NET35;NET40;$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFrameworkVersion)' == 'v4.5' ">
  <DefineConstants>NET10;NET20;NET30;NET35;NET40;NET45;$(DefineConstants)</DefineConstants>
</PropertyGroup>

我認為這種方法非常易讀易懂。




Links