前置き
今更感のある話ですが、.NET Standardのバージョンについて誤解している人もいるようなので、小ネタとして書いてみます。
nugetパッケージの依存関係
.NET Coreでプログラムを作る時、nugetから多種多様なライブラリを参照するのが普通です。
その際、自分の作っている環境にnugetパッケージが対応しているか、依存関係を見て判断すると思います。
例えば依存関係に以下のような記載があった場合、何の.NET実装のどのバージョンがサポートされているのでしょうか。
.NETStandard,Version=v2.0
NETStandard.Library (>=2.0.1)
依存関係を読む
Microsoftの.NET Standardのドキュメントを見てみましょう。
.NET Standard
2020年2月時点では以下の表が記載されています。
前段で例示したバージョン表記は.NET Standard 2.0。
.NET Coreの場合は2.0がサポートされていることになります。
この場合、.NET Core2.xで作られたプログラムでは使用できると見ることができます。
では、より新しいバージョンである.NET Core 3.xで作ったプログラムでは使えないのでしょうか?
.NET Standardのドキュメントを見直す
結論から先に言ってしまうと、.NET Core 3.xでも普通に使うことができます。
先ほどの.NET Standardのドキュメントをもう一度見てみます。
.NET 実装のサポートのセクションの中に以下のような記載があります。
次の表は、.NET Standard の各バージョンをサポートするプラットフォームの最小バージョンを一覧表示します。 つまり、一覧に示されたプラットフォームの以降のバージョンでは、対応する .NET Standard バージョンもサポートされます。 たとえば、.NET Core 2.2 では、.NET Standard 2.0 以前がサポートされます。
言い回しが分かりにくいですが、簡単に言うと.NET Standardの新しいバージョンは古いバージョン全てを含んでいます。
上記の例の様に .NETStandard,Version=v2.0 と記載されている場合、.NET Coreでは 2.x系と3.x系で作ったプログラムで使用することができます。
つまり.NET Standard v2.1に対応していないnugetパッケージでも、.NET Core 3.xのプログラムで使用することが可能です。
依存関係に複数の.NET Standardのバージョンの記載がある場合
nugetパッケージの中には複数の.NET Standardに対応している様に記載されている物があります。
一見不思議ですが、これは異常なものではありません。
またまた .NET Standardのドキュメントを見てみます。
対象にする .NET Standard バージョンのセクションの中に、以下の記載があります。
ただし、下位バージョンの .NET Standard を対象にしている場合、さまざまな依存関係のサポートが導入されます。 お使いのプロジェクトが .NET Standard 1.x を対象としている場合、.NET Standard 2.0 "も" 対象にすることをお勧めします。 これにより、.NET Standard 2.0 と互換性のあるフレームワーク上で実行されるライブラリのユーザーでは、依存関係グラフが簡素化され、ダウンロードが必要になるパッケージ数が減少します。
上位バージョンもターゲットに入れておくと依存ライブラリが減り、無駄が少なくなるので複数のバージョンが指定されているのです。
何が言いたかったか
使いたいnugetパッケージが .NET Standard 2.1 に対応していないからと言って、.NET Core 3.xでプログラムを作ることを諦める必要はありません。どんどん最新の.NET Coreでプログラムを作りましょう。
.NET Frameworkしか対応していないライブラリがある?自分で移植するか、さもなくば諦めてください。
もしそれがMicrosoft謹製のライブラリならばMicrosoftにissueを投げましょう。