.NET Standard

.NET Standard は、複数の .NET 実装で使用できる .NET API の正式な仕様です。 .NET Standard の背後にある意図は、.NET エコシステムの高度な統一性を確立することでした。 .NET 5 以降のバージョンでは、統一性を確立するための別のアプローチが採用されており、ほとんどのシナリオで .NET Standard が不要になります。 .NET Framework と他の .NET 実装 (.NET Core など) との間でコードを共有する場合は、ライブラリで .NET Standard 2.0 をターゲットとする必要があります。 .NET Standard の新しいバージョンはリリースされませんが、.NET 5 および将来のすべてのバージョンで .NET Standard 2.1 以前が引き続きサポートされます。

.NET 5 以降と .NET Standard のどちらを選択するかについては、この記事で後述する「.NET 5 以降と .NET Standard」を参照してください。

.NET Standard のバージョン

.NET Standard はバージョン管理されています。 新しいバージョンごとに API が追加されます。 特定のバージョンの .NET Standard に対して構築されているライブラリは、そのバージョン (以降) の .NET Standard を実装している .NET 実装で実行できます。

上位バージョンの .NET Standard をターゲットとすると、ライブラリでより多くの API を使用できるようになりますが、新しいバージョンの .NET でしか使用できません。 下位バージョンをターゲットとすると、使用可能な API は減りますが、ライブラリをより多くの場所で実行できます。

.NET Standard のバージョンの選択

.NET Standard 1.0 では、37,118 個の API のうち、7,949 個が使用可能です。

.NET 実装 バージョンのサポート
.NET と .NET Core 1.0、1.1、2.0、2.1、2.2、3.0、3.1、5.0、6.0、7.0、8.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6、5.4、6.4
Xamarin.iOS 10.0、10.14、12.16
Xamarin.Mac 3.0、3.8、5.16
Xamarin.Android 7.0、8.0、10.0
ユニバーサル Windows プラットフォーム 8.0、8.1、10.0、10.0.16299、TBD
Unity 2018.1

詳細については、「.NET Standard 1.0」を参照してください。 対話型のテーブルについては、「.NET Standard バージョン」を参照してください。

対象にする .NET Standard バージョン

以前のバージョンをサポートする必要がないかぎり、.NET Standard 2.0 を対象にすることをお勧めします。 ほとんどの汎用ライブラリでは、.NET Standard 2.0 外の API は必要ありません。 .NET Standard 2.0 はすべての最新のプラットフォームでサポートされており、1 つのターゲットで複数のプラットフォームをサポートする場合に推奨される方法です。

.NET Standard 1.x をサポートする必要がある場合、.NET Standard 2.0 "" 対象にすることをお勧めします。 .NET Standard 1.x は、NuGet の細かいパッケージ セットとして配布されます。大きなパッケージの依存関係グラフが作成されるため、開発者は構築時に多くのパッケージをダウンロードすることになります。 詳しくは、この記事でこれから登場するセクション、「クロスプラットフォーム ターゲット」と「.NET 5 以降と .NET Standard」をご覧ください。

.NET Standard のバージョン管理規則

バージョン管理規則は主に 2 つあります。

  • 追加式: .NET Standard バージョンは論理的に同心円形です。高位のバージョンには、旧バージョンのすべての API が組み込まれています。 バージョン間に互換性に影響する変更はありません。
  • 不変:出荷後、.NET Standard のバージョンは固定されます。

2\.1 より後に .NET Standard の新しいバージョンはありません。 詳しくは、後の「.NET 5 以降と .NET Standard」をご覧ください。

仕様

.NET Standard の仕様は、標準化された API のセットです。 この仕様は、.NET 実装、具体的には Microsoft (.NET Framework、.NET Core、Mono を含む) と Unity によって管理されています。

正式な成果物

正式な仕様は、標準に含まれる API を定義する一連の .cs ファイルです。 (現在アーカイブされている) dotnet/standard リポジトリref ディレクトリに、.NET Standard API が定義されています。

NETStandard.Library メタパッケージ (ソース) は、1 つ以上の .NET Standard のバージョンを定義する (一部) ライブラリのセットについて説明しています。

System.Runtime などの特定のコンポーネントは、次のように説明されています。

  • .NET Standard の一部 (そのスコープだけ)。
  • そのスコープの .NET Standard の複数のバージョン。

便利に読めるようにし、特定の開発者シナリオ (コンパイラを使用するなど) を可能にするために、派生成果物が提供されています。

パッケージ表現

.NET Standard 参照アセンブリの主要な配布手段は NuGet パッケージです。 実装は、各 .NET 実装に適切なさまざまな方法で配布されます。

NuGet パッケージは 1 つまたは複数のフレームワークを対象にしています。 .NET Standard パッケージは、".NET Standard" フレームワークを対象にしています。 netstandardコンパクト TFM (netstandard1.4 など) を使用して、.NET Standard フレームワークを対象にすることができます。 .NET の複数の実装で実行することが意図されたライブラリは、このフレームワークをターゲットにする必要があります。 広範なセットの API の場合、.NET Standard 1.6 から 2.0 の間に使用できる API の数は 2 倍以上になったため、netstandard2.0 を対象としてください。

NETStandard.Library メタパッケージは .NET Standard を定義する NuGet パッケージの完全なセットを参照しています。 netstandard を対象とする最も一般的な方法は、このメタパッケージを参照することです。 それは、.NET Standard を定義する約 40 の .NET ライブラリと関連する API について説明しており、それらにアクセスできるようにしています。 netstandard を対象とする追加のパッケージを参照して、追加の API にアクセスできます。

バージョン管理

仕様は 1 つだけではありませんが、直線的にバージョン管理された API のセットです。 標準の最初のバージョンは、API のベースライン セットを構築しています。 それ以降のバージョンでは、API が追加され、以前のバージョンによって定義された API を継承しています。 標準から API を削除するために確立された取り決めはありません。

.NET Standard は、1 つの .NET 実装に固有ではなく、それらの実装のいずれかのバージョン管理スキームに一致することもありません。

既に説明したように、2.1 より後に .NET Standard の新しいバージョンはありません。

ターゲットの .NET Standard

netstandard フレームワークと NETStandard.Library メタパッケージの組み合わせを使用して、.NET Standard Library をビルドできます。

.NET Framework 互換モード

.NET Standard 2.0 以降、.NET Framework 互換モードが導入されました。 この互換モードにより、.NET Standard プロジェクトは、あたかも .NET Standard にコンパイルされたかのように .NET Framework ライブラリを参照できます。 .NET Framework ライブラリの参照は、Windows Presentation Foundation (WPF) API を使用するライブラリのような、一部のプロジェクトでは機能しません。

詳細については、「.NET Framework 互換モード」を参照してください。

.NET Standard ライブラリと Visual Studio

Visual Studio で .NET Standard ライブラリを作成するには、Windows の場合は Visual Studio 2022Visual Studio 2019、または Visual Studio 2017 バージョン 15.3 以降、macOS の場合は Visual Studio for Mac バージョン 7.1 以降がインストールされている必要があります。

プロジェクトで .NET Standard 2.0 ライブラリを使用するだけである場合は、Visual Studio 2015 でこれを行うこともできます。 ただし、NuGet クライアント 3.6 以降がインストールされている必要があります。 Visual Studio 2015 用の NuGet クライアントは、NuGet のダウンロードのページからダウンロードできます。

.NET 5 以降と .NET Standard

.NET 5、.NET 6、.NET 7、.NET 8 は、Windows デスクトップ アプリとクロスプラットフォーム コンソール アプリ、クラウド サービス、Web サイトに使用できる統一された機能と API のセットを備えた単一の製品です。 .NET 8 TFM には、たとえば、次のような幅広いシナリオが反映されています。

  • net8.0

    この TFM は、どこでも実行できるコードを対象としています。 いくつか例外はありますが、クロスプラットフォームで動作するテクノロジだけが含まれています。 .NET 8 コードの場合、net8.0 によって netcoreappnetstandard 両方の TFM が置き換えられます。

  • net8.0-windows

    これは、net8.0 によって参照されているすべてのものに OS 固有の機能を追加する OS 固有の TFM の例です。

net8.0 と netstandard をターゲットにする状況

netstandard をターゲットにする既存のコードの場合、TFM を net8.0 以降に変更する必要はありません。 .NET 8.0 により、.NET Standard 2.1 以前が実装されています。 .NET Standard から .NET 8+ にターゲットを変更する唯一の理由は、より多くのランタイム機能、言語機能、または API にアクセスできるようにすることです。 たとえば、C# 9 を使用するには、.NET 5.0 以降のバージョンをターゲットにする必要があります。 .NET 8 と .NET Standard をマルチターゲットにして、新しい機能にアクセスしながら、他の .NET 実装でライブラリを使用できるようにすることができます。

.NET 5 以降用の新しいコードのガイドラインを次に示します。

  • アプリのコンポーネント

    アプリケーションを複数のコンポーネントに分割するためにライブラリを使用している場合、net8.0 をターゲットにすることをお勧めします。 わかりやすくするために、アプリケーションを構成するすべてのプロジェクトを、同じバージョンの .NET にするのが最善の方法です。 このようにすると、同じ BCL 機能をどこでも使用できます。

  • 再利用可能なライブラリ

    NuGet で配布する予定の再利用可能なライブラリを構築している場合は、リーチと使用可能な機能セットの間のトレードオフを検討してください。 .NET Standard 2.0 は .NET Framework によってサポートされている最新バージョンなので、非常に大きな機能セットで十分なリーチを提供します。 リーチの増加が最小限で、使用可能な機能セットが制限されるため、.NET Standard 1.x をターゲットにすることはお勧めしません。

    .NET Framework をサポートする必要がない場合は、.NET Standard 2.1 または .NET 8 を使用することもできます。 .NET Standard 2.1 はスキップし、.NET 8 に直接進むことをお勧めします。 最も広く使用されているライブラリは、.NET Standard 2.0 と .NET 5+ の両方をマルチターゲットにしています。 .NET Standard 2.0 をサポートすると、最大のリーチになります。一方、.NET 5 以降をサポートすると、.NET 5 以降を既に使用している顧客に対して最新のプラットフォーム機能を利用できるようになります。

.NET Standard の問題

ここで .NET Standard にあるいくつかの問題を示しておくと、.NET 5 以降のバージョンがプラットフォームとワークロード間でコードを共有するための優れた方法である理由を説明するのに役立ちます。

  • 新しい API が追加されるのが遅い

    .NET Standard は、すべての .NET 実装でサポートする必要がある API セットとして作成されているため、新しい API を追加する提案に対してレビュー プロセスがありました。 目標は、現在および将来のすべての .NET プラットフォームで実装できる API のみを標準化することでした。 その結果、ある機能が特定のリリースにない場合、Standard のバージョンに追加されるまで数年待たなければならないことがありました。 新しいバージョンの .NET Standard が広くサポートされるようになるまでは、さらに長く待ちました。

    .NET 5 以降のソリューション: コード ベースが共有されているため、機能が実装されるときには、.NET 5 以降のすべてのアプリとライブラリで既に使用できるようになっています。 また、API の仕様とその実装に違いがないため、.NET Standard の場合よりはるかに早く、新機能を利用できるようになります。

  • 複雑なバージョン管理

    API の仕様とその実装が分かれているため、API の仕様のバージョンと実装のバージョンの間のマッピングが複雑になります。 このような複雑さは、この記事で前に示した表と、その解釈方法の説明を見れば明らかです。

    NET 5 以降のソリューション: .NET 5 以降 の場合は、API の仕様とその実装は分かれていません。 その結果、TFM のスキームが簡単になります。 TFM のプレフィックスは、すべてのワークロードに対して 1 つです。net8.0 が、ライブラリ、コンソール アプリ、Web アプリに使用されます。 唯一のバリエーションは、特定のプラットフォームに対するプラットフォーム固有の API を指定するサフィックスです (net8.0-windows など)。 このような TFM の名前付け規則のおかげで、特定のアプリで特定のライブラリを使用できるかどうかを簡単に判断できます。 .NET Standard のようなバージョン番号対応テーブルは必要ありません。

  • 実行時のプラットフォーム非サポート例外

    .NET Standard の場合、プラットフォーム固有の API が公開されます。 移植できない場合であっても、コードはエラーなしでコンパイルされ、任意のプラットフォームに移植できるように見えます。 特定の API の実装がないプラットフォームで実行すると、実行時エラーが発生します。

    .NET 5 以降のソリューション: .NET 5 以降の SDK には、既定で有効になるコード アナライザーが含まれています。 実行しようとしているプラットフォームでサポートされていない API をうっかり使用すると、プラットフォーム互換性アナライザーによって検出されます。 詳細については、「プラットフォーム互換性アナライザー」を参照してください。

.NET Standard は非推奨ではない

.NET Standard は、複数の .NET 実装で使用できるライブラリにまだ必要です。 次のシナリオの場合、.NET Standard をターゲットにすることをお勧めします。

  • netstandard2.0 を使用して、.NET Framework と .NET の他のすべての実装の間でコードを共有する。
  • netstandard2.1 を使用して、Mono、Xamarin、.NET Core 3.x の間でコードを共有する。

関連項目