プロジェクト ファイル内で複数の .NET Framework バージョンをサポートする
プロジェクトを初めて作成するときは、.NET Standard クラス ライブラリを作成することをお勧めします。これにより、幅広い使用元プロジェクトとの互換性が提供されます。 .NET Standard を使用すると、.NET ライブラリへのクロスプラットフォーム サポートが既定で追加されます。 ただし、シナリオによっては、特定のフレームワークを対象とするコードを含める必要がある場合もあります。 この記事では、SDK スタイルのプロジェクトでこれを行う方法について説明します。
SDK スタイルのプロジェクトでは、プロジェクト ファイルで複数のターゲット フレームワーク (TFM) のサポートを構成してから、dotnet pack
または msbuild /t:pack
を使用してパッケージを作成できます。
Note
nuget.exe CLI では、SDK スタイルのプロジェクトのパッキングはサポートされていないため、dotnet pack
または msbuild /t:pack
のみを使用してください。 代わりに、通常 .nuspec
ファイル内にあるすべてのプロパティを、プロジェクト ファイルに含めることをお勧めします。 SDK 形式以外のプロジェクトで複数の .NET Framework バージョンを対象とする場合は、「複数の .NET Framework バージョンのサポート」を参照してください。
複数の .NET Framework バージョンをサポートするプロジェクトを作成する
Visual Studio か
dotnet new classlib
を使用して、新しい .NET Standard クラス ライブラリを作成します。互換性を最大限に高めるために、.NET Standard クラス ライブラリを作成することをお勧めします。
.csproj ファイルを編集して、ターゲット フレームワークをサポートします。 たとえば、
<TargetFramework>netstandard2.0</TargetFramework>
この行を次のように変更します。
<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 プロパティ名の一覧については、「pack ターゲット」を参照してください。 また、「依存関係アセットを制御する」も参照してください。
ビルド関連のプロパティを NuGet メタデータから分離する場合は、別の
PropertyGroup
を使用するか、NuGet プロパティを別のファイルに配置し、MSBuild のImport
ディレクティブを使用してそれを含めることができます。Directory.Build.Props
およびDirectory.Build.Targets
は、MSBuild 15.0 以降でもサポートされています。次に、
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>