-
Notifications
You must be signed in to change notification settings - Fork 0
MS_DotNetStandard
- 戻る(.NETのクロスプラットフォーム対応)
- .NET Standard
- .NET Core
- .NET Standardへの移行
-
.NET Standard は、次世代のポータブル クラス ライブラリ (PCL) であるとのこと。
-
.NET Standard は、
- バージョンごとに「線形的」な管理が行われていて、
- 新しいバージョンの .NET Standard は
古いバージョンで定められている全ての API セットを含むようになっている。 - 従来の PCL のようにプロファイル(プラットフォーム)ごとに
使用できる API が決定するのではなく、
.NET Standard の特定バージョンをサポートしている環境であれば、
その全てで .NET Standard を利用できる。
∴ クロスプラットフォームで実行可能なライブラリを作成する手段として、
従来の PCL を置き換える。
補足(最新化:現在の位置づけ): .NET Standard は
2.1 で更新が止まっており、新しいバージョンは出ない。
「廃止・非推奨」ではないが、新規開発で選ぶ理由はほぼ無い。
状況 選ぶターゲット .NET Framework も対象に含めたい netstandard2.0(今も有効な選択).NET(5 以降)だけでよい net8.0など直接指定複数を同時に マルチターゲット( <TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>)「.NET 5 以降ですべてが 1 つになった」ため、
共通 API セットという抽象層の必要性が下がった、というのが本質である。
- CLI の実装系が持つべき API のセットを定義
- 仕様なので実装系はその API を実装しない、または実装できないことがある。
補足: 「実装しないことがある」の実例として、
netstandard2.0に含まれる API を呼んでも
実行時にPlatformNotSupportedExceptionになるケースがある
(例: .NET Core 上のSystem.Configuration系、一部のSystem.Drawing)。コンパイルが通ることは、動作の保証ではない点に注意が要る。
-
.NET Framework のエコシステムは既に想定以上に広がっていたため、
- Xamarin もベースとしている Mono が .NET Framework 互換
-
「.NET Core の普及に伴い、自然と新しい API(≒ .NET Core)に移行。」
とはならなかった。- .NET Standard の範囲を広げ、従来の .NET Framework の API をより多くサポート。
- 既存の .NET Framework 向けのライブラリを
.NET Core(など)でそのまま動作できるようにする。
- .NET Standard | Microsoft Learn
https://learn.microsoft.com/dotnet/standard/net-standard - dotnet/standard - versions.md
https://github.com/dotnet/standard/blob/master/docs/versions.md
-
Target Platform Moniker (TPM) とは、
- NuGet での対象プラットフォームを表す識別子
- PCL(のプロファイル)の後継
-
TPM で、.NET Standard のバージョンを指定した場合、当該バージョンで
- 定義される標準ライブラリのみを使用して動作する。
- サポートされるプラットフォーム用のアプリケーションから使用できる。
-
TPM としての .NET Standard 2.0(
netstandard2.0)- 追加されるライブラリ群
-
BinaryFormatterと、それに伴うインターフェイスやカスタム属性。 - ADO.NET(
DataSet, Data Provider, e.g.DbConnection.GetSchema)のサポート。 -
mscorlib/System/System.Core/System.Numerics/System.Data/
System.IO.Compression/System.Xml/System.Xml.Linq/System.Web/
System.Net.Http/System.Runtime.Serialization/System.Drawing/
System.ComponentModel.Composition
-
- 追加されるライブラリ群
補足(
BinaryFormatterは使用禁止):netstandard2.0に含まれているが、
BinaryFormatterは既知の危険な API である
(任意コード実行につながるデシリアライズ脆弱性)。
- .NET 5 で既定無効化
- .NET 8 で警告(
SYSLIB0011)- .NET 9 で完全に削除
代替は
System.Text.Json/MessagePack(MessagePack)/
protobuf(Protocol Buffers)など。
- NuGet パッケージとしての .NET Standard パッケージ
(NETStandard.Library) -
[TypeForwardedTo]による FCL 互換の実行時の型転送用ファサードアセンブリ -
netstandard.dllという実行時の型転送用ファサードアセンブリになる
- TPM =
netstandard1.xの小さなバージョンの方が多くの環境で動作する模様。 - stripe-dotnet などユーザが多いライブラリは、より多くのユーザを
サポートするため、2.x にアップグレードする予定はないもよう。
https://github.com/stripe/stripe-dotnet/issues/992
-
.NET 5 以降で「単一プラットフォーム (.NET)」に統一、
クロスプラットフォーム対応にもnet6.0+が推奨。 -
「最大の互換性を持つ共通 API セット」としての位置づけにあるが、
将来性を考えるとやや古い。 -
サポート
- Microsoft は、大量の API 追加と互換性レイヤー導入のため、
バージョン番号を 2.0 に上げることにした。- Standard 1.x への破壊的変更は導入されず、1.6 をベースにしている。
- .NET Standard 1.0 の 400%、1.6 の 140% 増の 32,000 以上の API が含まれる。
- 互換レイヤ(.NET Framework 向けのライブラリを動かす薄いレイヤ)により、
NuGet パッケージの 70% ほどが Standard と互換になった。 - .NET 4.6.0(以前)や Windows Phone 8、Windows 8.x(ストアアプリ)を
サポートする必要がなければ、2.0 の方が多くの環境で動作する。
- Microsoft は、大量の API 追加と互換性レイヤー導入のため、
補足(
netstandard2.0は今も現役): 上の「やや古い」という評価はあるが、
ライブラリ作者にとっては今も第一候補である。理由は、
- .NET Framework 4.6.1+ と .NET Core 2.0+ の両方から参照できる唯一の TPM
net8.0を指定すると .NET Framework から使えなくなる実際、多くの OSS が
netstandard2.0をマルチターゲットに含めている。
アプリはnet8.0、ライブラリはnetstandard2.0も併記、が実務的な形。
-
正式な「非推奨(deprecated)」ではなく事実上「非推奨」
- .NET 5 以降で「単一プラットフォーム (.NET)」に統一された。
- 2.0 のような「最大の互換性を持つ共通 API セット」としての位置づけにない。
-
サポート
- 策定された新機能は .NET Core 3.0 / Xamarin, Mono, Unity に実装される。
- 「.NET Standard 2.1」は「.NET Core 3.0」でサポート。
- 一方「.NET Framework 4.8 では 2.0 のサポートに留まる」。
移行メモ(正誤): 元ページに「.NET Standard は、[.NET 6] で廃止予定」
という記述があったが、これは誤りである。
元ページ自身も .NET 6 側で「すいません、ガセネタでした」と
訂正しており、Microsoft も
「.NET Standard は非推奨ではない」
と明記している。正しくは「新バージョンは出ないが、
netstandard2.0は
互換性のためのターゲットとして残る」である。
netstandard2.1を選ぶ意味がほぼ無いのは事実で、
.NET Framework から使えず、かつ .NET 5+ なら直接指定すればよいため、
「中途半端な位置」になっている。
.NET Core アンインストール ツール(dotnet-core-uninstall)を使用すると、
--all-but-latest / --all-lower-patches / --all-previews-but-latest などの
オプションで、比較的、安全に、SDK とランタイムのアンインストールができる。
-
アンインストール ツール
https://learn.microsoft.com/dotnet/core/additional-tools/uninstall-tool -
.NET ランタイムと SDK を削除する
https://learn.microsoft.com/dotnet/core/install/remove-runtime-sdk-versionsランタイムは、1.x や 2.x などのメジャー バージョン 'バンド' 内で最新を維持し、
SDK は、前バージョンを対象とするアプリケーションをビルドする機能が維持されるので最新を維持。
- .NET Standard | Microsoft Learn
https://learn.microsoft.com/dotnet/standard/net-standard - .NET API Browser
https://learn.microsoft.com/dotnet/api/ - .NET Core と .NET Standard の分かりやすい解説(MSDN magazine)
https://learn.microsoft.com/archive/msdn-magazine/2018/january/net-standard-demystifying-net-core-and-net-standard
- .NET Standard 2.0とは何か
https://www.infoq.com/jp/news/2016/12/dotnet-standard-20-goals - .NET Standard 2.0が最終版に
https://www.infoq.com/jp/news/2017/08/net-standard-2
- 特集:マイクロソフトテクノロジーの現在と未来:.NET Standardとは - @IT
http://www.atmarkit.co.jp/ait/articles/1707/28/news033.html
- .NET Standardなライブラリプロジェクトを作成して参照する - Build Insider
https://www.buildinsider.net/language/dotnetcore/05 - 主に技術日記: .NET Standard のおさらい
http://yfakariya.blogspot.jp/2016/12/net-standard.html - .NET Standard とは何か? | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/8218
Tags: 移行, .NET開発, .NET Core, .NET Standard
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。