web-dev-qa-db-ja.com

.NETフレームワークの複数のバージョンを対象とする最良の方法は何ですか?

クラスライブラリを作成し、NuGetパッケージを展開します。これにより、追加するプロジェクトの.NET Frameworkバージョンに基づいて、参照として追加するさまざまなアセンブリを選択できます。これは非常に素晴らしい機能ですが、単一のクラスライブラリプロジェクトを作成し、複数のバージョンの.NETフレームワークに対してビルドすることが可能かどうか疑問に思っています。

私はむしろ避けたい:

MyLibrary40.dllおよびMyLibrary45.dll

可能であれば、2つのプロジェクトは多くのコードを共有する必要があるためです。 4.5バージョンは、4.5の機能であるasync関数を提供します。

誰もがこれに最適なアプローチを知っていますか?複数のビルド構成を使用できますか?または、別のプロジェクトルートを下る必要がありますか?

C++で作業していた場合は、おそらく複数の構成と#ifは、1つの構成でのみサポートされている関数をブロックしますが、これにより、同じ名前の2つのアセンブリが異なることを行うことになります。

前もって感謝します!

47
Dave Kerr

少なくとも2つのプロジェクト(1つは.net 4用、もう1つは.net 4.5)を持つVisualStudio Solutionが1つ必要です。

すべてのコードファイルを.net 4-projectに追加し、他のプロジェクトでコードファイルをリンクとして追加します("Add Existing Item..."-ダイアログおよびAdd as link

ここで、.NET 4.5のすべてのコードとクラスを4.5プロジェクトに追加します。

さらに、独自のコンパイラスイッチ(条件付きコンパイルシンボル)をプロジェクトに定義する必要があります。 NET 4プロジェクトのNET4や.NET 4.5プロジェクトのNET4.5など)

ビルド->一般->条件付きコンパイルスイッチの下のプロジェクト設定でスイッチを設定します。

コードでは、次のようにスイッチを使用して、.NET 4または.NET 4.5のコードを生成できます。

#if NET4
  // code only for .NET 4
#endif

// code for all framework versions.

#if NET45
  // code only for .NET 4.5
#endif
37
Jehof

簡単なアプローチは、別の.csprojファイルを同じフォルダーに追加し、異なるフレームワークバージョンをビルドするように構成することです。これは、両方のプロジェクトが本質的に同じフォルダー構造上のviewsであるため、ファイルにリンクを追加する必要がなくなります。

次の構造を持っているとしましょう:

- MyLibrary\
  - MyLibrary.sln
  - MyLibrary\
    - MyLibrary.csproj
    - Program.cs

MyLibrary.csprojを同じフォルダーに複製し、編集していくつかの変更を行います。

  • <ProjectGuid>は、この要素の値に新しいGUID=
  • <TargetFrameworkVersion>ここで代替バージョンを指定します。例:v4.5またはv3.5
  • <OutputPath>(デバッグおよびリリース用)これをbin\Debug\net45bin\Debug\net45などの一意のパスに設定して、各プロジェクトの出力を一意の場所に配置できるようにします

また、並列ビルド中に2つのプロジェクトがobjフォルダーで衝突しないように、新しい要素を非条件の<PropertyGroup>要素に追加する必要があります。これは重要であり、奇妙な競合状態のバグから保護します。

<PropertyGroup>
  <BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>

最後に、この新しいプロジェクトを既存のソリューションに追加します。

このアプローチは、NET35NET45などのコンパイルスイッチを定義し、#if NET35/#endifディレクティブを使用して連携して機能します。

この手法を使用する2つのオープンソースプロジェクトは、 MetadataExtractorNetMQ です。問題が発生した場合に参照できます。

15
Drew Noakes

私が知っている古い質問であり、これは当時は適切な答えではありませんでした...しかし、共有ファイルを使用することが可能になりました。

5
Stephen Drew