プロジェクト ファイル内で複数の .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 バージョンをサポートするプロジェクトを作成する

  1. Visual Studio か dotnet new classlib を使用して、新しい .NET Standard クラス ライブラリを作成します。

    互換性を最大限に高めるために、.NET Standard クラス ライブラリを作成することをお勧めします。

  2. .csproj ファイルを編集して、ターゲット フレームワークをサポートします。 たとえば、

    <TargetFramework>netstandard2.0</TargetFramework>

    この行を次のように変更します。

    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>

    XML 要素が単数形から複数形に変更されていることを確認します ("s" を開始タグと終了タグの両方に追加します)。

  3. 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
       }
    }
    
  4. 必要な NuGet メタデータをすべて MSBuild プロパティとして .csproj に追加します。

    使用可能なパッケージ メタデータと MSBuild プロパティ名の一覧については、「pack ターゲット」を参照してください。 また、「依存関係アセットを制御する」も参照してください。

    ビルド関連のプロパティを NuGet メタデータから分離する場合は、別の PropertyGroup を使用するか、NuGet プロパティを別のファイルに配置し、MSBuild の Import ディレクティブを使用してそれを含めることができます。 Directory.Build.Props および Directory.Build.Targets は、MSBuild 15.0 以降でもサポートされています。

  5. 次に、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>

関連項目