3

#ifdef されたコードベースを 2 つの異なるターゲット フレームワーク、つまり 3.5 と 4.0 にコンパイルしようとしています。

ソリューション内の .proj ファイルを変更しようとしましたが、役に立ちませんでした。

MSBuild / VS2012 が UI を介してソリューション構成の変更を認識していないようです。

これは、.proj ファイルの 1 つのフラグメントです。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>..\Binaries\</OutputPath>
    <DefineConstants>TRACE;NET35</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug 40|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>..\Binaries\</OutputPath>
    <DefineConstants>TRACE;DEBUG;NET40</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  </PropertyGroup>

「リリース」から「デバッグ 40」に切り替えると、プロジェクトのプロパティでターゲット フレームワークが変更されません (したがって、他の条件付きで参照されるアセンブリのためにコンパイルが中断されます)。

また、別のアセンブリを条件付きで参照する際にも問題が発生しています。これも、VS/MSBuild によってソリューション構成が取得されていないかのようです (参照に表示されないものもあります)。

編集: 次の行で v3.5 ビルドから Microsoft.CSharp を除外しています。

<Reference Include="Microsoft.CSharp" Condition=" '$(Configuration)' == 'Debug 40'" />

これまでのところ、無視されているのは TargetFrameworkVersion プロパティだけのようです。

4

1 に答える 1

2

問題は 2 つあります。

  • ReSharper (v7) では、さまざまなファイルにまたがるコンパイル エラーが表示されるため、コードが実際に条件付き参照でコンパイルされたことを認識するのが難しくなります。バージョン 7 はプロジェクト ファイルの手動変更をサポートしていないと思うので、RS7 ユーザーに注意してください。
  • VS2012 は UI でターゲット フレームワークを変更しません (MSBuild の詳細な出力に見られるように、コンパイル時に正しいフレームワークを実際に使用しているにもかかわらず)。

最終的には、コードベースをコンパイルするのに少しの忍耐が必要でした。@granataCoder の提案によると、異なる出力パスを保持することもお勧めします (条件付きコンパイルなどの直交する問題を処理するときに見落としやすい可能性があります)。

于 2013-09-04T09:44:30.520 に答える