最初にプロジェクトを作成するときは、.NET Standard クラス ライブラリを作成することをお勧めします。これは、最も広範な使用プロジェクトとの互換性を提供するためです。 .NET Standard を使用すると、既定で クロスプラットフォーム サポート を .NET ライブラリに追加します。 ただし、シナリオによっては、特定のフレームワークを対象とするコードを含める必要がある場合もあります。 この記事では、 SDK スタイル のプロジェクトでこれを行う方法について説明します。
SDK スタイルのプロジェクトでは、プロジェクト ファイル内の複数のターゲット フレームワーク (TFM) のサポートを構成し、 dotnet pack または msbuild /t:pack を使用してパッケージを作成できます。
注
nuget.exe CLI は SDK スタイルのプロジェクトのパッキングをサポートしていないため、 dotnet pack または msbuild /t:packのみを使用する必要があります。 通常、.nuspec ファイルに含まれるすべてのプロパティを、代わりにプロジェクトファイルに含めることをお勧めします。 SDK スタイル以外のプロジェクトで複数の .NET Framework バージョンを対象にするには、「複数の .NET Framework バージョンのサポート」を参照してください。
複数の .NET Framework バージョンをサポートするプロジェクトを作成する
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>