source: https://github.com/dotnet/corefx/blob/d32b06a/Documentation/project-docs/standard-platform.md
合わせて読みたい: https://docs.com/iwanaga-nobuyuk/2848/net-platform-standard
これは、将来の.NETクラスライブラリの計画として共有するものです。 この成果の進捗については、 https://github.com/dotnet/corefx/issues/4367 を見て下さい。
注意 : netstandard TFM(訳注: target framework moniker)は、パッケージではまだ機能しません。これはまだ dotnet として実装されています。詳細と進捗状況については、先のissuesを見て下さい。
これは、将来の.NET互換プラットフォームのために、現在よりも理解しやすいプラットフォームのバージョニング計画によって、バイナリ互換性をより具体的に保証するためのものです。
今日では、ポータブル クラスライブラリ (PCL) は、プロジェクトの作成時に、あなた自身によるプラットフォームの選択に基づいて、APIの部分集合を規定します。 これによって、あなたは、自身が作業するものとして選んだプラットフォームを動作保証の対象とする、一定のサーフィスの範囲を得られます。(訳注: サーフィスについては後述の「参照アセンブリ」を参照) これらの組み合わせ群は、適切な守備範囲をあなたにお届けできるように、事前に計算されています。 これらのポータブル ライブラリがNuGetにパッケージされた時、これらは静的なフレームワーク集合、たとえばportable-net45+win8のように表されます。 これは、あなたが.NET 4.5およびWindows 8.0上でコードを動作させたいという意図を記述しているわけですが、新しいプラットフォームは、それらのPCLを十分に実行できるとしても、プロジェクト作成時に選択されていなかったということで、ブロックされてしまいます。 実際のところ、ポータブルなdllをプロファイルの静的なリストをあらわすフォルダの中に置くということ自体が、本質的にこれをプラットフォーム固有のものにしてしまうのです。 これでは実のところ、以下のようにするのと変わりません:
MyLibrary/net45/MyLibrary.dll
MyLibrary/win8/MyLibrary.dll
最大の違いは、あなたがこれをPCLの種類のプロジェクトにおいて利用できない、ということです。 (訳注: それだけが大きな違いであるということも含意しています。)
この.NETプラットフォーム標準のバージョンは、ただひとつの代名(モニカ)を使用して、プラットフォーム間でのバイナリ移植性を実現しようというものです。 これは、既存のポータブルクラスライブラリの機構の発展形です。 これらは、portable-a+b+cのような、静的なモニカのリストに縛り付けられない、「未来を閉ざしていない」ものです。
.NETプラットフォーム標準のバージョン群は、現在、開発者が使っている、NuGetでportable-a+b+cとして表されるPortableXXXプロファイル(たとえばProfile111)と、大して違いません。 主な違いは、ただひとつの.NETプラットフォーム標準のモニカが進化し線形的にバージョンアップして、NuGetその他のツールが互換性を推測できる、すなわち新しい.NETプラットフォーム標準のバージョンが古いものと互換であると判断できる、ということです。
- .NETプラットフォーム標準 - 全ての.NETプラットフォームがCoreFX リポジトリで規定しているとおりにサポートしなければならない、特定の参照アセンブリのバージョン情報付きの集合体。
- PCL - ポータブル クラスライブラリ
- プラットフォーム - .NET Framework 4.5, .NET Framework 4.6, Windows Phone 8.1, MonoTouch, UWPなど
- 参照アセンブリ - APIサーフィスのみを含むアセンブリ。メソッド本体にはILがありません。これはコンパイル時にのみ使用され、実行することはできません。一般に「コントラクト」とも言われます。
- 実装アセンブリ - ある参照アセンブリの実装を含むアセンブリ。独立したアセンブリであることもありますが、プラットフォームにアンカーされていて、プラットフォームをアップデートしない限りアップデート出来ない、ということもあります。
- アンカーされたアセンブリ - 実装アセンブリのうち、少なくともひとつのプラットフォームが、そのプラットフォームの一部として実装を提供する(そのアセンブリ「を」参照して実装するのではない)もの。このような「アンカーされたアセンブリ」は、そのプラットフォーム上では、そのプラットフォーム自身をアップデートすることによってのみ、アップデートできます。
- マルチターゲティング - 同一のソースコードファイルを、別々の対象プラットフォーム用に、すなわち別々のAPI集合に対して、コンパイルすること。
- 標準ライブラリ - Core .NET APIの聖別された集合体とバージョンとして、規定されサポートされるもの。ここには、そのプラットフォーム標準に含まれる全てのAPIに加えて、.NET Coreに位置付けられるがこのプラットフォーム標準の上で実装される、追加のライブラリが含まれます。複数の標準ライブラリのバージョンが、同じプラットフォーム標準をサポートすることもあります。
- プラットフォームの所有者は、.NETプラットフォーム標準の特定のバージョンの参照アセンブリを実装する
- プラットフォームの所有者は、.NETプラットフォーム標準の特定のバージョンの参照アセンブリのサブセットを実装しても良い
- 参照アセンブリのAPIサーフィス上に、いかなる変更が生じた場合でも、.NETプラットフォーム標準のバージョンは更新される
- 下位バージョンは常に上位バージョンと互換となる
この.NETプラットフォーム標準は、それ自体はプラットフォームではありません。 これは、プラットフォームが実装すべき標準です。 この.NETプラットフォーム標準では、プラットフォームが実装しなければならない参照アセンブリ(コントラクト)を定義します。 それらの参照アセンブリ(すなわち、標準)は、CoreFX リポジトリで定義されています。 こちらが、このプラットフォーム標準に含まれるコントラクトのリスト案です。
この図は、プラットフォーム標準、標準ライブラリ、アンカー プラットフォームの関係を表すものです。 「プラットフォーム バージョン」と題する横の行は、もし変更があった場合に、1つ以上のプラットフォームのサポートが欠落する、というものを表しています(訳注: 「標準ライブラリの」変更と解釈するのが妥当)。 「標準ライブラリ」と題する縦の行は、各プラットフォームがサポートしなければならないものと、.NETのコアとなるライブラリの集合ではあるが、どのプラットフォームについてもサポートを失わない範囲でアップデートできるものを、表しています。 標準ライブラリについては、詳しくはまた後ほど…
それぞれのアセンブリをアンカーする方法については、プラットフォームごとにそれぞれのルールがあります。 .NET Frameworkでは、全てのAPIがアンカーされています。 CoreCLRとMonoの.NET Core実装では、mscorlib中の全て(コア アセンブリ)がアンカーされています。 アンカーされたアセンブリに関してチャレンジングなのは、それらがアップデートしたとき、定義上、それらがアンカーされた既存のプラットフォームのサポートは、(プラットフォームのコピーが常に先んじることになるため)全て失われてしまう、ということです。 あるプラットフォームが、新しいプラットフォーム標準をサポートしていると言うためには、その標準の最新のAPIと、アップデートされた アンカーされたAPI を、用意しなければなりません。 アンカーするプラットフォームとアンカーされるライブラリの所有者は、一致してアップデートを実現する必要があります。
一般的に、.NETプラットフォーム標準の低いバージョン(1.0など)をターゲットとするクラスライブラリは、最も多くの既存プラットフォーム上でロードできますが、アクセスできるAPIの集合は小さくなります。 逆に、.NETプラットフォーム標準の高いバージョン(1.3など)をターゲットとするクラスライブラリは、比較的少数の、新しいプラットフォームでのみロードできますが、より多くの、より新しいAPIの集合にアクセスできるようになります。
対象プラットフォーム名 | エイリアス | |||||
---|---|---|---|---|---|---|
.NETプラットフォーム標準 | netstandard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 |
.NET Framework | net | → | → | → | → | 4.6.x |
→ | → | → | 4.6 | |||
→ | → | 4.5.2 | ||||
→ | → | 4.5.1 | ||||
→ | 4.5 | |||||
Universal Windows Platform | uap | → | → | → | 10.0 | |
Windows | win | → | → | 8.1 | ||
→ | 8.0 | |||||
Windows Phone | wpa | → | → | 8.1 | ||
→ | 8.0 | |||||
Windows Phone Silverlight | wp | 8.1 | ||||
8.0 | ||||||
DNX Core | dnxcore | → | → | → | → | 5.0 |
Mono/Xamarinプラットフォーム | → | → | → | → | * | |
Mono | → | → | * |
- あるライブラリが.NETプラットフォーム標準バージョン1.3をターゲットとする場合、それは.NET Framework 4.6以降、Universal Windows Platform 10 (UWP)、DNX Core 5.0、Mono/Xamarinプラットフォームのみで実行できます。
- あるライブラリが.NETプラットフォーム標準バージョン1.3をターゲットとする場合、それは以前の.NETプラットフォーム標準の全てのバージョン(1.2, 1.1, 1.0)からのライブラリを全て利用できます。
- .NETプラットフォーム標準をサポートする.NET Frameworkの最古のバージョンは、.NET Framework 4.5です。これは、.NETプラットフォーム標準の基盤となる、新しいポータブルAPIサーフィスの範囲(つまりSystem.Runtimeのサーフィスの範囲)が、あのバージョンの.NET Frameworkで初めて利用可能になったためです。.NET Framework 4.0以前をターゲットとするなら、マルチターゲティングが必要になります。
- 各.NETプラットフォーム標準のバージョンでは、より多くのAPIサーフィスを有効にしており、それはすなわち、より少ないプラットフォーム上でのみ利用できるということを意味します。プラットフォームがアップデートされるにつれ、それらは新しい.NETプラットフォーム標準のバージョンにジャンプアップしていきます。
- 更新をやめたプラットフォーム -- Silverlight on Windows Phoneなど -- は、初期の.NETプラットフォーム標準でのみ利用可能です。
PCLプロジェクトは.NETプラットフォーム標準(netstandard1.x)でビルドされたパッケージを利用できるようになります。
以下の表では、PCLポータブル プロファイルから、サポートされる.NETプラットフォーム標準バージョンへの、対応を示しています。
.NETプラットフォーム標準へ簡単に移行するためには、それをターゲットとしたいパッケージは、imports
要素( ドキュメントを参照)によって、PCLパッケージに依存できるようになります。
portable-
パッケージには、それらの依存関係が明示的に含まれていないため、portable-
パッケージに依存する.NETプラットフォーム標準用のパッケージは、それ自身でそのパッケージの依存関係を含める必要があります。
プロファイル | .NET プラットフォーム 標準バージョン |
---|---|
Profile7 .NET Portable Subset (.NET Framework 4.5, Windows 8) | 1.1 |
Profile31 .NET Portable Subset (Windows 8.1, Windows Phone Silverlight 8.1) | 1.0 |
Profile32 .NET Portable Subset (Windows 8.1, Windows Phone 8.1) | 1.2 |
Profile44 .NET Portable Subset (.NET Framework 4.5.1, Windows 8.1) | 1.2 |
Profile49 .NET Portable Subset (.NET Framework 4.5, Windows Phone Silverlight 8) | 1.0 |
Profile78 .NET Portable Subset (.NET Framework 4.5, Windows 8, Windows Phone Silverlight 8) | 1.0 |
Profile84 .NET Portable Subset (Windows Phone 8.1, Windows Phone Silverlight 8.1) | 1.0 |
Profile111 .NET Portable Subset (.NET Framework 4.5, Windows 8, Windows Phone 8.1) | 1.1 |
Profile151 .NET Portable Subset (.NET Framework 4.5.1, Windows 8.1, Windows Phone 8.1) | 1.2 |
Profile157 .NET Portable Subset (Windows 8.1, Windows Phone 8.1, Windows Phone Silverlight 8.1) | 1.0 |
Profile259 .NET Portable Subset (.NET Framework 4.5, Windows 8, Windows Phone 8.1, Windows Phone Silverlight 8) | 1.0 |
** 備考: Xamarinプラットフォームが、上記の既存のプロファイル番号に加わります **
VS2013およびVS2015における既存のPCLプロジェクトは(UWPターゲットを含め)、.NETプラットフォーム標準バージョン1.2までのみをターゲットとできます。.NETプラットフォーム標準バージョン1.3以降のライブラリをビルドするためには、2つの選択肢があります:
- csprojベースのプロジェクトでproject.jsonを使う
- xprojベースのプロジェクト、たとえば「クラスライブラリ(パッケージ)」プロジェクト テンプレートを使う
.NETプラットフォーム標準バージョン | NuGet識別子 |
---|---|
1.0 - 1.4 | netstandard1.0 - netstandard1.4 |
プラットフォーム | NuGet識別子 |
---|---|
.NET Framework 2.0 - 4.6 | net20 - net46 |
.NET Micro Framework | netmf |
Windows 8 | win8, netcore45 |
Windows 8.1 | win8, netcore451 |
Windows Phone Silverlight (8, 8.1) | wp8, wp81 |
Windows Phone 8.1 | wpa8.1 |
Universal Windows Platform 10 | uap10, netcore50 |
DNX on .NET Framework 4.5.1 - 4.6 | dnx451 - dnx46 |
DNX on .NET Core 5.0 | dnxcore50 |
Silverlight 4, 5 | sl4, sl5 |
MonoAndroid | monoandroid |
MonoTouch | monotouch |
MonoMac | monomac |
Xamarin iOS | xamarinios |
Xamarin PlayStation 3 | xamarinpsthree |
Xamarin PlayStation 4 | xamarinpsfour |
Xamarin PlayStation Vita | xamarinpsvita |
Xamarin Watch OS | xamarinwatchos |
Xamarin TV OS | xamarintvos |
Xamarin Xbox 360 | xamarinxboxthreesixty |
Xamarin Xbox One | xamarinxboxone |
プラットフォーム | NuGet識別子 |
---|---|
ASP.NET 5.0 on .NET Framework | aspnet50 |
ASP.NET 5.0 on .NET Core | aspnetcore50 |
Windows 8 | winrt |
NuGetパッケージを作成する際は、ターゲットとしたいプラットフォームの モニカの名前のフォルダを指定するだけで十分です。
MyPackage
MyPackage/lib/netstandard1.3/MyPackage.dll
上記の例は、.NETプラットフォーム1.3(.NETプラットフォーム標準1.3)をターゲットとしています。
上記の表をもとに、ポータブル アセンブリのビルドに使用されるcsprojのプロファイル番号を使用して、そのアセンブリがどのNuGetフォルダに移動すべきかを決定します。 例えば、Newtonsoft.Json 7.0.1 には 2つのポータブル フォルダがあります:
Newtonsoft.Json/7.0.1/lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.dll
Newtonsoft.Json/7.0.1/lib/portable-net45+wp80+win8+wpa81+dnxcore50/Newtonsoft.Json.dll
最初のものは.NETプラットフォーム標準でサポートされていない.NET 4.0をターゲットとしているため、2番目のものだけがnetstandard1.xベースの参照に変換できます。 csprojを見ると、この2番目のPCLプロジェクトは本当にプロファイル259であることが分かります。
Newtonsoft.Json/7.0.1/lib/portable-net40+sl5+wp80+win8+wpa81/Newtonsoft.Json.dll
Newtonsoft.Json/7.0.1/lib/netstandard1.0/Newtonsoft.Json.dll
以前のPCLパッケージとは異なり、.NETプラットフォーム標準をターゲットとする場合は、そのパッケージの依存関係は完全に指定される必要があります。 依存関係におけるバージョンの特定性は問題になりませんが、依存関係の記述は問題になります。 短期的には、この問題を簡単に解決するために、Oren Novotnyが、.NETプラットフォーム標準に準拠するプロジェクト/アセンブリ用のnuspecメタデータから、正しい依存関係を生成できるツールをビルドしてくれました:
https://github.com/onovotny/ReferenceGenerator
我々は今後、Visual Studioのプロジェクト システムで、これに類似するものを、ファーストクラスの使用感で実現したいと思っています。
PCLCrypto はbait and switchのテクニックを用いてポータブル サーフィスの範囲を使用した、ポピュラーなNuGetパッケージです。 通常、このテクニックは、いくつかのプラットフォーム固有のフォルダ(switch)と、コンパイル用(参照アセンブリ)のポータブルのフォルダ(bait)によって成されます:
PCLCrypto/1.0.80/lib/Xamarin.iOS/PCLCrypto.dll
PCLCrypto/1.0.80/lib/monoandroid/PCLCrypto.dll
PCLCrypto/1.0.80/lib/monotouch/PCLCrypto.dll
PCLCrypto/1.0.80/lib/win81/PCLCrypto.dll
PCLCrypto/1.0.80/lib/wp8/PCLCrypto.dll
PCLCrypto/1.0.80/lib/wpa81/PCLCrypto.dll
PCLCrypto/1.0.80/lib/portable-win8+wpa81+wp80+MonoAndroid10+xamarinios10+MonoTouch10/PCLCrypto.dll
このライブラリがPCLプロジェクトで参照されると、portable-*のdllがコンパイル時に使用されます。 これによって、プラットフォーム間で統一的なサーフィスエリアを使用するような他のPCLが(訳注:このライブラリを参照しながら)作成できます。 このパッケージを特定のプラットフォームで参照すると、プラットフォーム固有の実装が選択されます。
.NETプラットフォーム標準のバージョン、そしてNuGet v3では、このようなパッケージを作成するための公式なアプローチを導入しました。
PCLCryptoは以下のようなかたちに変わるでしょう:
PCLCrypto/1.0.80/lib/Xamarin.iOS/PCLCrypto.dll
PCLCrypto/1.0.80/lib/monoandroid/PCLCrypto.dll
PCLCrypto/1.0.80/lib/monotouch/PCLCrypto.dll
PCLCrypto/1.0.80/lib/win81/PCLCrypto.dll
PCLCrypto/1.0.80/lib/wp8/PCLCrypto.dll
PCLCrypto/1.0.80/lib/wpa81/PCLCrypto.dll
PCLCrypto/1.0.80/ref/netstandard1.0/PCLCrypto.dll
この ref
フォルダ(ref
は"reference assembly"の省略)は、コンパイラに、どのアセンブリを使用してコンパイルするかを指示するためのものです。
これの.NETプラットフォーム標準のバージョンは、そのパッケージ中の特定プラットフォーム群("lib"のサブフォルダとして指定されたもの)の全てをカバーするように選択されるべきです。
ある.NETプラットフォーム標準の参照アセンブリの一部を実装するプラットフォームをサポートするために、それらのライブラリが動作する環境を、ライブラリの作成者が予測できるように、ガードレール が導入されました。
例えば、新しいプラットフォーム .NET Banana 1.0 が導入されたとしましょう。
.NET Banana 1.0 は、.NETプラットフォーム標準1.3に準拠していることを示していますが、System.AppContext
参照アセンブリを実装していないとします。
.NETプラットフォーム標準バージョン1.3をターゲットとするクラスライブラリの作成者は、そのパッケージが**.NET Banana 1.0**上では動作しないかもしれない、ということを判断する必要があります。
{
"supports": [
".NET Banana 1.0"
],
"dependencies": {
"System.AppContext": "5.0.0"
},
"frameworks": {
"netstandard1.3": { }
}
}
上記のproject.json
は、NuGetに互換性チェックを行わせ、System.AppContext
の実装アセンブリが**.NET Banana 1.0**上に存在していることを要求します。もしこの依存関係のチェックに失敗したら、あなたには2つの選択肢があります:
- .NET Banana 1.0をサポートしない
- .NET Banana 1.0のフレームワークを明示的に追加したマルチターゲットとして(これは現在のところxprojでのみサポートされています)、プラットフォーム固有の、
System.AppContext
APIの代替を使用する。(もし存在するなら)
{
"frameworks": {
"netstandard1.3": {
"dependencies": {
"System.AppContext": "5.0.0"
}
},
"netbanana1.0": { }
}
}
netstandard
TFMのツール サポートに必要なものは以下の通りです。このリストは最新状況を反映するために定期的に更新される予定です。
- Visual Studio 2015: With NuGet Extension
<TBD>
- Visual Studio 2013: With NuGet Extension
<TBD>
- Visual Studio 2012: With NuGet Extension
<TBD>
- NuGet CLI 3.x:
<TBD>
- NuGet CLI 2.x:
<TBD>
- DNU:
<TBD>
- Xamarin Studio:
<TBD>
コントラクト/参照アセンブリ |
---|
Microsoft.Win32.Primitives |
System.AppContext |
System.Console |
System.Diagnostics.Debug |
System.Diagnostics.Process |
System.Globalization |
System.Globalization.Calendars |
System.IO |
System.IO.FileSystem |
System.IO.FileSystem.Primitives |
System.Net.Primitives |
System.Net.Sockets |
System.Reflection |
System.Reflection.Primitives |
System.Runtime |
System.Runtime.Extensions |
System.Runtime.Handles |
System.Runtime.InteropServices |
System.Runtime.InteropServices.RuntimeInformation |
System.Runtime.Numerics |
System.Threading |
System.Threading.Tasks |
System.Threading.Timer |
System.Diagnostics.Tracing |
System.Text.Encoding |
System.Reflection.TypeExtensions |
System.Reflection.Extensions |
System.Resources.ResourceManager |
X
- 特定の.NETプラットフォーム標準バージョンで出現したAPI←
- 最も近いX
によって決定されるAPIバージョン。例: 以下の表では、.NETプラットフォームバージョン1.4をターゲットとして、Microsoft.CSharpを参照した場合、APIバージョン 1.0が得られます。
コントラクト | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 |
---|---|---|---|---|---|
Microsoft.CSharp | X | ← | ← | ← | ← |
Microsoft.VisualBasic | X | ← | ← | ← | |
Microsoft.Win32.Primitives | X | ← | |||
Microsoft.Win32.Registry | X | ← | |||
Microsoft.Win32.Registry.AccessControl | X | ← | |||
System.AppContext | X | ← | |||
System.Collections | X | ← | ← | X | ← |
System.Collections.Concurrent | X | ← | X | ← | |
System.Collections.NonGeneric | X | ← | |||
System.Collections.Specialized | X | ← | |||
System.ComponentModel | X | ← | ← | ← | ← |
System.ComponentModel.Annotations | X | ← | X | ← | |
System.ComponentModel.EventBasedAsync | X | ← | ← | X | ← |
System.ComponentModel.Primitives | X | ← | |||
System.ComponentModel.TypeConverter | X | ← | |||
System.Console | X | ← | |||
System.Data.Common | X | ← | |||
System.Data.SqlClient | X | ← | |||
System.Diagnostics.Contracts | X | ← | ← | ← | ← |
System.Diagnostics.Debug | X | ← | ← | X | ← |
System.Diagnostics.FileVersionInfo | X | ← | |||
System.Diagnostics.Process | X | X | |||
System.Diagnostics.StackTrace | X | ← | |||
System.Diagnostics.TextWriterTraceListener | X | ← | |||
System.Diagnostics.Tools | X | ← | ← | ← | ← |
System.Diagnostics.TraceSource | X | ← | |||
System.Diagnostics.Tracing | X | X | X | ← | |
System.Dynamic.Runtime | X | ← | ← | X | ← |
System.Globalization | X | ← | ← | X | ← |
System.Globalization.Calendars | X | ← | |||
System.Globalization.Extensions | X | ← | |||
System.IO | X | ← | ← | X | ← |
System.IO.Compression | X | ← | X | ← | |
System.IO.Compression.ZipFile | X | ← | |||
System.IO.FileSystem | X | ← | |||
System.IO.FileSystem.AccessControl | X | ← | |||
System.IO.FileSystem.DriveInfo | X | ← | |||
System.IO.FileSystem.Primitives | X | ← | |||
System.IO.FileSystem.Watcher | X | ← | |||
System.IO.IsolatedStorage | X | ← | ← | ← | ← |
System.IO.MemoryMappedFiles | X | ← | |||
System.IO.Pipes | X | ← | |||
System.IO.UnmanagedMemoryStream | X | ← | |||
System.Linq | X | ← | ← | ← | ← |
System.Linq.Expressions | X | ← | ← | X | ← |
System.Linq.Parallel | X | ← | ← | ← | |
System.Linq.Queryable | X | ← | ← | ← | ← |
System.Net.Http | X | ← | ← | ← | |
System.Net.Http.Rtc | X | ← | ← | ← | |
System.Net.Http.WinHttpHandler | X | ← | |||
System.Net.NameResolution | X | ← | |||
System.Net.NetworkInformation | X | ← | ← | X | ← |
System.Net.Ping | X | ← | |||
System.Net.Primitives | X | X | ← | X | ← |
System.Net.Requests | X | X | ← | X | ← |
System.Net.Security | X | ← | |||
System.Net.Sockets | X | X | |||
System.Net.WebHeaderCollection | X | ← | |||
System.Net.WebSockets | X | ← | |||
System.Net.WebSockets.Client | X | ← | |||
System.Numerics.Vectors | X | ← | |||
System.ObjectModel | X | ← | ← | X | ← |
System.Reflection | X | ← | ← | X | ← |
System.Reflection.Context | X | ← | ← | ← | |
System.Reflection.DispatchProxy | X | ← | |||
System.Reflection.Emit | X | ← | ← | ← | |
System.Reflection.Emit.ILGeneration | X | ← | ← | ← | ← |
System.Reflection.Emit.Lightweight | X | ← | ← | ← | ← |
System.Reflection.Extensions | X | ← | ← | ← | ← |
System.Reflection.Primitives | X | ← | ← | ← | ← |
System.Reflection.TypeExtensions | X | ← | |||
System.Resources.ReaderWriter | X | ← | |||
System.Resources.ResourceManager | X | ← | ← | ← | ← |
System.Runtime | X | ← | X | X | ← |
System.Runtime.CompilerServices.VisualC | X | ← | |||
System.Runtime.Extensions | X | ← | ← | X | ← |
System.Runtime.Handles | X | ← | |||
System.Runtime.InteropServices | X | X | X | ← | |
System.Runtime.InteropServices.RuntimeInformation | X | ← | ← | ← | |
System.Runtime.InteropServices.WindowsRuntime | X | ← | ← | ← | ← |
System.Runtime.Loader | X | ← | ← | ← | ← |
System.Runtime.Numerics | X | ← | ← | ← | |
System.Runtime.Serialization.Json | X | ← | ← | ← | ← |
System.Runtime.Serialization.Primitives | X | ← | ← | X | ← |
System.Runtime.Serialization.Xml | X | ← | ← | X | ← |
System.Runtime.WindowsRuntime | X | ← | X | ← | ← |
System.Runtime.WindowsRuntime.UI.Xaml | X | ← | ← | ← | |
System.Security.AccessControl | X | ← | |||
System.Security.Claims | X | ← | |||
System.Security.Cryptography.Algorithms | X | ← | |||
System.Security.Cryptography.Cng | X | ← | |||
System.Security.Cryptography.Csp | X | ← | |||
System.Security.Cryptography.Encoding | X | ← | |||
System.Security.Cryptography.OpenSsl | X | ← | |||
System.Security.Cryptography.Primitives | X | ← | |||
System.Security.Cryptography.X509Certificates | X | ← | |||
System.Security.Principal | X | ← | ← | ← | ← |
System.Security.Principal.Windows | X | ← | |||
System.ServiceModel.Duplex | X | ← | ← | ← | |
System.ServiceModel.Http | X | X | ← | X | ← |
System.ServiceModel.NetTcp | X | ← | X | ← | |
System.ServiceModel.Primitives | X | X | ← | X | ← |
System.ServiceModel.Security | X | X | ← | ← | ← |
System.ServiceProcess.ServiceController | X | ← | |||
System.Text.Encoding | X | ← | ← | X | ← |
System.Text.Encoding.CodePages | X | ← | |||
System.Text.Encoding.Extensions | X | ← | ← | X | ← |
System.Text.RegularExpressions | X | ← | ← | X | ← |
System.Threading | X | ← | ← | X | ← |
System.Threading.AccessControl | X | ← | |||
System.Threading.Overlapped | X | ← | |||
System.Threading.Tasks | X | ← | ← | X | ← |
System.Threading.Tasks.Parallel | X | ← | ← | ← | |
System.Threading.Thread | X | ← | |||
System.Threading.ThreadPool | X | ← | |||
System.Threading.Timer | X | ← | ← | ||
System.Xml.ReaderWriter | X | ← | ← | X | ← |
System.Xml.XDocument | X | ← | ← | X | ← |
System.Xml.XmlDocument | X | ← | |||
System.Xml.XmlSerializer | X | ← | ← | X | ← |
System.Xml.XPath | X | ← | |||
System.Xml.XPath.XDocument | X | ← | |||
System.Xml.XPath.XmlDocument | X | ← |