Skip to content

MS_DotNetStandard

nishi_74322014 edited this page Aug 12, 2026 · 1 revision

.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 セットという抽象層の必要性が下がった、というのが本質である。

文脈上の意味

仕様としての .NET Standard

  • CLI の実装系が持つべき API のセットを定義
  • 仕様なので実装系はその API を実装しない、または実装できないことがある。

補足: 「実装しないことがある」の実例として、
netstandard2.0 に含まれる API を呼んでも
実行時に PlatformNotSupportedException になるケースがある
(例: .NET Core 上の System.Configuration 系、一部の System.Drawing)。

コンパイルが通ることは、動作の保証ではない点に注意が要る。

仕様としての .NET Standard "2.0"

  • .NET Framework のエコシステムは既に想定以上に広がっていたため、

    • Xamarin もベースとしている Mono が .NET Framework 互換
  • .NET Core の普及に伴い、自然と新しい API(≒ .NET Core)に移行。」
    とはならなかった。

    • .NET Standard の範囲を広げ、従来の .NET Framework の API をより多くサポート。
    • 既存の .NET Framework 向けのライブラリを
      .NET Core(など)でそのまま動作できるようにする。

参考

Target Platform Moniker (TPM) としての .NET Standard

  • 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 / MessagePackMessagePack)/
protobufProtocol Buffers)など。

NuGet パッケージとしての .NET Standard

  • NuGet パッケージとしての .NET Standard パッケージ
    NETStandard.Library
  • [TypeForwardedTo] による FCL 互換の実行時の型転送用ファサードアセンブリ
  • netstandard.dll という実行時の型転送用ファサードアセンブリになる

バージョン

1.x

  • TPM = netstandard1.x小さなバージョンの方が多くの環境で動作する模様。
  • stripe-dotnet などユーザが多いライブラリは、より多くのユーザを
    サポートするため、2.x にアップグレードする予定はないもよう。
    https://github.com/stripe/stripe-dotnet/issues/992

2.0(netstandard2.0

  • .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 の方が多くの環境で動作する。

補足(netstandard2.0 は今も現役): 上の「やや古い」という評価はあるが、
ライブラリ作者にとっては今も第一候補である。理由は、

  • .NET Framework 4.6.1+ と .NET Core 2.0+ の両方から参照できる唯一の TPM
  • net8.0 を指定すると .NET Framework から使えなくなる

実際、多くの OSS が netstandard2.0 をマルチターゲットに含めている。
アプリは net8.0、ライブラリは netstandard2.0 も併記、が実務的な形。

2.1(netstandard2.1

  • 正式な「非推奨(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 Uninstall Tool

.NET Core アンインストール ツール(dotnet-core-uninstall)を使用すると、
--all-but-latest / --all-lower-patches / --all-previews-but-latest などの
オプションで、比較的、安全に、SDK とランタイムのアンインストールができる。

参考

microsoft.com

infoq.com

@IT

その他


Tags: 移行, .NET開発, .NET Core, .NET Standard

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally