.NET Standard 2.1の紹介
2018年11月5日、以下で「.NET Standard 2.1」が紹介されています。.NET Standardとは
「.NET Standard」は各種APIを定めた仕様書です。仕様書ですので「.NET Standard」自体はソフトウェアではありません。
例えば「.NET Core」は「.NET Standard」で定義された仕様を実装したソフトウェアの1つです。
他にも「.NET Standard」をサポートしたソフトウェアが存在します。
共通仕様
「.NET Standard」をサポートしたソフトウェアが「.NET Standard」のみをサポートしているというわけではありません。「.NET Standard」で定義されていないAPIを実装していることもあります。
「.NET Standard」は.NETプラットフォームにおける共通仕様であり、実装が仕様を追い越すことも、既存の実装から仕様に落とし込むこともあります。
後者に関しては「.NET Standard」が後から出てきた仕組みであるためです。
「.NET Standard」は.NETプラットフォームにおけるサブセットと捉えることもできるでしょう。
仕様書にもバージョンがある
世の中に存在する仕様書の多くがそうであるように、「.NET Standard」にもバージョンがあります。現時点で「.NET Standard 2.1」を実装した「.NET Core」はリリースされていません。
現在最新版の「.NET Core 2.1.5」は、「.NET Standard 2.0」を実装したソフトウェアです。
.NET Standardの目的
「.NET Standard」の目的は、デスクトップアプリケーション、モバイルアプリケーション及びゲーム、クラウドサービスなど、.NET開発者が必要とする様々な分野で横断的にコードを共有できるよう、コードの共有に関する問題を解決することです。「.NET Standard」に基づいた実装により、プラットフォームが異なっていても大きくコードを書き直すことなく既存のコードを活用し、開発コストやメンテナンスコストを抑えることができます。
.NETプラットフォームに統一性を
「.NET Standard」は、すべての.NETプラットフォームで実装しなければならないAPI群を定義しています。「.NET Standard」により.NETプラットフォームに統一性を持たせ、将来起こりうるであろう.NETプラットフォームの分断を防ぎます。
PCL(ポータブルクラスライブラリー)を置き換える
「.NET Standard」は似たような目的を持つ「PCL」を置き換えます。.NET Standardのバージョンとその実装
どのソフトウェアがどのバージョンの「.NET Standard」を実装しているか確認するには、以下を参照してください。また各「.NET Standard」のバージョンに対応したリファレンスも上記で参照できます。
.NET Standard 2.1
さて「.NET Standard 2.1」の仕様が確定された後、「.NET Standard 2.1」を実装したソフトウェアが登場することになります。アップデートを行う良い時期
現在「.NET Core 2.1.5」がリリースされており、今後「.NET Core 2.2.0」がリリースされる予定です。開発チームは今が「.NET Standard」のアップデートを行う良い時期と考えており、新しい仕組みの導入や既存機能の細かな改良を行い、「.NET Standard 2.1」により.NETプラットフォーム全体の共通化の強化及び改良を行う方針です。
ここでは「.NET Standard 2.1」で導入されるであろう注目機能を紹介します。
約3,000のAPIを追加
「.NET Standard 2.1」では、「.NET Standard 2.0」から約3,000のAPIが追加される予定です。これらのAPIの多くは新規APIですが、.NETプラットフォームの統一性をさらに高めるために追加された既存APIもあります。
Span<T>の導入
「Span<T>」自体はすでに「.NET Core 2.1」で導入されています。「Span<T>」は配列のような型であり、マネージド及びアンマネージドメモリー上に存在するデータを同じ手法で扱うことができます。
またメモリー上でデータをコピーすることなく、データの抜き出し(スライス)も可能です。
「.NET Core 2.1」にとって「Span<T>」の導入は、最もパフォーマンスの向上に寄与する改良でした。
「Span<T>」はより効果的な方法でバッファーを管理できるため、メモリーの確保やデータコピーの削減に役立ちます。
「Span<T>」をもっと活用してもらうためにはランタイムやコンパイラーによる「Span<T>」のサポートが必要であり、開発チームは「Span<T>」を基本型としての導入を検討しています。
「Span<T>」に関する詳細は、以下を参照してください。
Span<T>と連携して動作する基本APIの追加
また「Span<T>」と連携して動作する基本APIの追加も行われます。現在でも「.NET Standard」互換の「NuGet(System.Memory)」パッケージの導入により「Span<T>」を利用することもできましたが、このパッケージを導入すると「Span<T>」を扱う.NET標準型のメンバーを拡張することができなくなります。
Reflection emit
.NETエコシステムでは生産性向上のために、「Reflection(リフレクション)」や「Reflection Emit」といった動的な機能が常に多用されています。「Emit」はパフォーマンスを最適化する手段として、そしてプロキシーインターフェースのタイプを簡単に生成する手段として良く利用されます。
そのため開発者から「Reflection Emit」を「.NET Standard」に含んで欲しいとの要望が数多く挙げられました。
元々この機能は「NuGet」パッケージ経由での提供が考えられていましたが、パッケージを活用したコア技術モデルの確立は困難なことが分りました。
「.NET Standard 2.1」では「Reflection Emit」と同様に「Lightweight Code Generation(LCG)」にアクセスできるようになります。
またコード生成に関する以下のAPIも追加されています。
- RuntimeFeature.IsDynamicCodeSupported
- RuntimeFeature.IsDynamicCodeCompiled
SIMD
「.NET Framework」及び「.NET Core」では、すでに「SIMD」がサポートされています。「SIMD」は文字列の比較など「Base Class Library(BCL)」内の基本操作の処理速度向上に活用されています。
この機能はランタイムのサポートが必要であり、開発者から「.NET Standard」に含んで欲しいとの要望が数多く挙げられました。
ValueTaskとValueTask<T>
「ValueTask<T>」は「Task<T>」を割り当てることなく、完了した処理の処理結果を同期的に受け取ることができます。「ValueTask<T>」はすでに存在していますが、その対になる非ジェネリック版の「ValueTask」により、メモリー確保の程度を減らすことができます。
DbProviderFactories
「DbProviderFactories」によりライブラリーやアプリケーションは、コンパイル時に特定のADO.NETプロバイダーのタイプを知らなくても、名称に基づき登録された「DbProviderFactory」インスタンスを指定することで、そのADO.NETプロバイダーを活用できるようになります。その他
「.NET Core」はオープンソースであり、「.NET Core」で導入された改良が「.NET Standard 2.1」にも追加されます。これには「System.HashCode」の改良や「System.String」の新しいオーバーロードが含まれます。
.NET Core 3.0で.NET Standard 2.1をサポート
「.NET Standard 2.1」は「.NET Core 3.0」でサポート予定です。一方「.NET Framework 4.8」では、「.NET Standard 2.0」のサポートに留まります。
これは「.NET Core」と「.NET Framework」にポリシーの違いがあるためです。
.NET Frameworkのポリシー
「.NET Framework」は、10億以上のマシンにインストールされる.NETの実装であり、可能な限り互換性を維持する必要があります。そのため「.NET Core」よりもゆっくりとした速度で変化していきます。
アプリケーションは既存の「.NET Framework」の振る舞いに依存しているため、セキュリティーの改善や不具合の修正でさえも、アプリケーションが動作しなくなる原因になり得ます。
「.NET Framework」は、常に最新のネットワークプロトコルやセキュリティー標準、そして「Windows」の機能をサポートするように開発されています。
.NET Coreのポリシー
「.NET Core」はオープンソースかつクロスプラットフォームで開発されており、積極的に開発されている.NETの実装です。「.NET Framework」ではポリシーのためサポートできない新しいAPIや言語機能が積極的に追加されます。
ランタイムの変更が必要
「.NET Standard 2.1」では約3,000のAPIが追加されるため、「.NET Standard 2.1」に対応するにはランタイムの変更が必要になります。そのため「.NET Framework 4.8」では互換性を維持するため、「.NET Standard 2.0」に留まるのが望ましいとの判断が行われています。
「.NET Standard 2.1」は「.NET Core 3.0」でサポートされると共に、「Xamarin」「Mono」「Unity」 の新しいバージョンでも「.NET Core 3.0」がサポートされる予定です。
.NET Standard 2.0に留まる判断
「.NET Framework」を利用する顧客にライブラリーを提供し、そのライブラリーの開発者がその顧客をサポートする必要がある場合は、「.NET Standard 2.0」に留まることをお勧めします。「.NET Standard 2.1」で追加されるAPIの多くは、高度な使い方(シナリオ)を実現するためのものです。
実際多くのライブラリーは「.NET Standard 2.0」に留まれるでしょう。
ただしライブラリーの開発者は、例え「.NET Framework」をサポートする必要があるとしても、「.NET Standard 2.1」で追加されるAPIを活用できないということではありません。
マルチターゲットを利用し「.NET Standard 2.0」及び「.NET Standard 2.1」の双方でコンパイルできます。
詳細については、以下を参照してください。