最初にプロジェクトを作成するときは、.NET Standard クラス ライブラリを作成することをお勧めします。これは、最も広範な使用プロジェクトとの互換性を提供するためです。 .NET Standard を使用すると、既定で クロスプラットフォーム サポート を .NET ライブラリに追加します。 ただし、シナリオによっては、特定のフレームワークを対象とするコードを含める必要がある場合もあります。 この記事では、 SDK スタイル のプロジェクトでこれを行う方法について説明します。
SDK スタイルのプロジェクトでは、プロジェクト ファイル内の複数のターゲット フレームワーク (TFM) のサポートを構成し、 dotnet pack または msbuild /t:pack を使用してパッケージを作成できます。
複数の .NET フレームワークをサポートするプロジェクトを作成する
Visual Studio で新しい .NET Standard クラス ライブラリを作成するか、
dotnet new classlibを使用します。互換性を最大限に高める .NET Standard クラス ライブラリを作成することをお勧めします。
ターゲット フレームワークをサポートするように .csproj ファイルを編集します。 たとえば、変更する
<TargetFramework>netstandard2.0</TargetFramework>to:
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>XML 要素を単数形から複数形に変更したことを確認します (開いているタグと閉じるタグの両方に "s" を追加します)。
1 つの TFM でのみ動作するコードがある場合は、
#if NET45または#if NETSTANDARD2_0を使用して TFM に依存するコードを分離できます。 (詳細については、「 マルチターゲットの方法」を参照してください)。たとえば、次のコードを使用できます。public string Platform { get { #if NET45 return ".NET Framework" #elif NETSTANDARD2_0 return ".NET Standard" #else #error This code block does not match csproj TargetFrameworks list #endif } }必要な NuGet メタデータを MSBuild プロパティとして .csproj に追加します。
使用可能なパッケージ メタデータと MSBuild プロパティ名の一覧については、 パック ターゲットを参照してください。 依存関係資産の制御も参照してください。
ビルド関連のプロパティを NuGet メタデータから分離する場合は、別の
PropertyGroupを使用するか、別のファイルに NuGet プロパティを配置し、MSBuild のImportディレクティブを使用して含めることができます。Directory.Build.PropsMSBuild 15.0 以降では、Directory.Build.Targetsもサポートされています。次に、
dotnet packを使用し、結果の .nupkg は .NET Standard 2.0 と .NET Framework 4.5 の両方を対象としています。
上記の手順と .NET Core SDK 2.2 を使用して生成される .csproj ファイルを次に示します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
<Description>Sample project that targets multiple TFMs</Description>
</PropertyGroup>
</Project>
重複するフレームワークを使用したマルチターゲット
NuGet 7.6 / .NET SDK 10.0.300 以降では、同じ基になるフレームワークに解決される複数のTargetFrameworks値を使用できます。 これにより、複数のランタイムのビルドや、1 つのプロジェクトからホスト アプリケーションの複数のバージョンを対象とするシナリオが可能になります。
復元とパックでの動作の詳細については、 複数のフレームワークのターゲット設定に関するページを参照してください。