クラスライブラリを作成し、NuGetパッケージを展開します。これにより、追加するプロジェクトの.NET Frameworkバージョンに基づいて、参照として追加するさまざまなアセンブリを選択できます。これは非常に素晴らしい機能ですが、単一のクラスライブラリプロジェクトを作成し、複数のバージョンの.NETフレームワークに対してビルドすることが可能かどうか疑問に思っています。
私はむしろ避けたい:
MyLibrary40.dll
およびMyLibrary45.dll
可能であれば、2つのプロジェクトは多くのコードを共有する必要があるためです。 4.5バージョンは、4.5の機能であるasync
関数を提供します。
誰もがこれに最適なアプローチを知っていますか?複数のビルド構成を使用できますか?または、別のプロジェクトルートを下る必要がありますか?
C++で作業していた場合は、おそらく複数の構成と#if
は、1つの構成でのみサポートされている関数をブロックしますが、これにより、同じ名前の2つのアセンブリが異なることを行うことになります。
前もって感謝します!
少なくとも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
簡単なアプローチは、別の.csproj
ファイルを同じフォルダーに追加し、異なるフレームワークバージョンをビルドするように構成することです。これは、両方のプロジェクトが本質的に同じフォルダー構造上のviewsであるため、ファイルにリンクを追加する必要がなくなります。
次の構造を持っているとしましょう:
- MyLibrary\
- MyLibrary.sln
- MyLibrary\
- MyLibrary.csproj
- Program.cs
MyLibrary.csproj
を同じフォルダーに複製し、編集していくつかの変更を行います。
<ProjectGuid>
は、この要素の値に新しいGUID=<TargetFrameworkVersion>
ここで代替バージョンを指定します。例:v4.5
またはv3.5
<OutputPath>
(デバッグおよびリリース用)これをbin\Debug\net45
やbin\Debug\net45
などの一意のパスに設定して、各プロジェクトの出力を一意の場所に配置できるようにしますまた、並列ビルド中に2つのプロジェクトがobj
フォルダーで衝突しないように、新しい要素を非条件の<PropertyGroup>
要素に追加する必要があります。これは重要であり、奇妙な競合状態のバグから保護します。
<PropertyGroup>
<BaseIntermediateOutputPath>obj\net45\</BaseIntermediateOutputPath>
最後に、この新しいプロジェクトを既存のソリューションに追加します。
このアプローチは、NET35
やNET45
などのコンパイルスイッチを定義し、#if NET35
/#endif
ディレクティブを使用して連携して機能します。
この手法を使用する2つのオープンソースプロジェクトは、 MetadataExtractor と NetMQ です。問題が発生した場合に参照できます。
私が知っている古い質問であり、これは当時は適切な答えではありませんでした...しかし、共有ファイルを使用することが可能になりました。