.NET RID カタログ
RID はランタイム識別子の略です。 RID の値は、アプリケーションが実行されている対象プラットフォームの識別に使用されます。
これは NuGet パッケージのプラットフォーム固有のアセットを表すために、.NET パッケージによって使用されます。 RID は、たとえば linux-x64
、win-x64
、または osx-x64
などの値です。
ネイティブ依存関係のあるパッケージの場合、パッケージを復元できるプラットフォームが RID によって指定されます。
プロジェクト ファイルの <RuntimeIdentifier>
要素では、1 つの RID を設定できます。 複数の RID は、プロジェクト ファイルの <RuntimeIdentifiers>
要素でセミコロン区切りのリストとして定義できます。 以下の .NET CLI コマンドの --runtime
オプションで使用することもできます。
具体的なオペレーティング システムを表す RID は通常、[os].[version]-[architecture]-[additional qualifiers]
のようなパターンになります。それぞれ、次のような意味があります。
[os]
はオペレーティング システムまたはプラットフォーム システムのモニカーです。 たとえば、ubuntu
のようにします。[version]
は、オペレーティング システムのバージョンをドット区切りの形式 (.
) で表したバージョン番号です。 たとえば、15.10
のようにします。バージョンはマーケティング バージョンにしないでください。マーケティング バージョンは、プラットフォームの API アクセス領域が異なる、オペレーティング システムの複数の個別バージョンを表すことがよくあるためです。
[architecture]
はプロセッサ アーキテクチャです。 たとえばx86
、x64
、arm
またはarm64
などです。[additional qualifiers]
はさまざまなプラットフォームをさらに区別します。 たとえば、aot
のように指定します。
RID グラフ
RID グラフまたはランタイム フォールバック グラフとは、相互に互換性のある RID の一覧です。
これらの RID は、dotnet/runtime
リポジトリの PortableRuntimeIdentifierGraph.json で定義されます。 このファイルでは、基本となる RID を除くすべての RID に "#import"
ステートメントが記述されていることを確認できます。 このステートメントは互換性のある RID を示しています。
.NET 8 より前では、バージョン固有およびディストリビューション固有の RID は dotnet/runtime
リポジトリ内にある runtime.json ファイルに定期的に追加されていました。 このグラフは現在更新されておらず、下位互換性オプションとして存在しています。 開発者は、バージョン固有でもディストリビューション固有でもない RID を使用する必要があります。
NuGet はパッケージを復元する際、指定されたランタイムと正確に一致するものを見つけようとします。 正確に一致するものが見つからない場合、NuGet は、RID グラフに基づいて最も互換性のあるシステムが見つかるまでグラフを遡ります。
次に示す例は、osx-x64
の RID として実際に記述されているものです。
"osx-x64": {
"#import": [ "osx", "unix-x64" ]
}
上の RID は osx-x64
が unix-x64
をインポートすることを指定します。 そのため、NuGet はパッケージを復元する際、osx-x64
と正確に一致するものをパッケージから見つけようとします。 特定のランタイムが見つからなかった場合、NuGet は、たとえば unix-x64
ランタイムを指定しているパッケージを復元できます。
次の例は、runtime.json ファイルにも定義されている少し大きめの RID グラフです。
linux-arm64 linux-arm32
| \ / |
| linux |
| | |
unix-arm64 | unix-x64
\ | /
unix
|
any
または、 RidGraph ツールを使用して、RID グラフ (またはグラフの任意のサブセット) を簡単に視覚化することもできます。
すべての RID は最終的にルート any
RID にマッピングされます。
RID を使用する際に留意しておく必要のある注意事項があります。
コンポーネント パーツを取得する目的で RID を解析する行為はお止めください。
プラットフォームであらかじめ定義されている RID を使用します。
RID は特定の値である必要があるため、実際の値から推測した値にしないでください。
絶対に必要でない限り、プログラムで RID を作成しないでください。
一部のアプリでは、プログラムで RID を計算する必要があります。 その場合、計算された RID は、大文字と小文字の区別を含め、カタログと正確に一致する必要があります。 大文字と小文字が異なる RID は、OS で大文字と小文字が区別される場合 (Linux など) に問題が発生する原因となります。この値は、出力パスなどを作成するときに使用されることが多いためです。 たとえば、ソリューション構成マネージャーとプロジェクトのプロパティからの情報に依存する、Visual Studio のカスタム発行ウィザードを考えてみましょう。 たとえば、ソリューション構成から無効な値 (たとえば、
arm64
の代わりにARM64
) が渡された場合、win-ARM64
などの無効な RID が生成されるおそれがあります。
RID の使用
RID を使用するには、どのような RID があるのか知る必要があります。 最新の完全なバージョンについては、dotnet/runtime
リポジトリの PortableRuntimeIdentifierGraph.json を参照してください。
'移植可能' とみなされる RID、つまり特定のバージョンや OS ディストリビューションに関連付けられていない RID が推奨される選択肢です。 これは、プラットフォーム固有のアプリケーションの構築と、RID 固有のアセットを含む NuGet パッケージの作成の両方にポータブル RID を使用する必要があることを意味します。
.NET 8 以降、.NET SDK およびランタイムの既定の動作では、バージョン固有およびディストリビューション固有ではない RID のみが考慮されます。 復元およびビルドする場合、SDK は小さいポータブル RID グラフを使用します。 RuntimeInformation.RuntimeIdentifier は、ランタイムが構築されたプラットフォーム を返します。 実行時に、.NET は既知のポータブル RID セットを使用して RID 固有のアセットを検索します。 実行時に無視される可能性がある RID 固有のアセットを含むアプリケーションをビルドする場合、SDK は警告 NETSDK1206 を発行します。
特定の OS バージョンまたはディストリビューションのアセットの読み込み
.NET は、OS バージョンまたはディストリビューションに固有の依存関係を解決するための最上級のサポートを提供することを試みなくなりました。 アプリケーションまたはパッケージが OS のバージョンまたはディストリビューションに基づいて異なるアセットを読み込む必要がある場合は、条件付きでアセットを読み込むロジックを実装する必要があります。
プラットフォームに関する情報を取得するには、System.OperatingSystem API を使用します。 Windows および macOS では、Environment.OSVersion はオペレーティング システムのバージョンを返します。 Linux では、カーネル バージョンがこれに該当する可能性があります。Linux ディストリビューション名とバージョン情報を取得するための推奨手順は、/etc/os-release ファイルを読み取ることです。
.NET は、読み込みロジックをカスタマイズするためのさまざまな拡張ポイント (NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver)、AssemblyLoadContext.ResolvingUnmanagedDll、AssemblyLoadContext.Resolving、AppDomain.AssemblyResolve など) を提供しています。 これらを使用して、現在のプラットフォームに対応する資産を読み込むことができます。
既知の RID
次の一覧では、各 OS に使用される最も一般的な RID の小さいサブセットを示します。 最新の完全なバージョンについては、dotnet/runtime
リポジトリの PortableRuntimeIdentifierGraph.json を参照してください。
Windows RID
win-x64
win-x86
win-arm64
詳細については、「Windows に .NET をインストールする」を参照してください。
Linux RID
linux-x64
(CentOS Stream、Debian、Fedora、Ubuntu、および派生ディストリビューションなどのほとんどのデスクトップ ディストリビューション)linux-musl-x64
(Alpine Linux など、musl を使用している軽量ディストリビューション)linux-musl-arm64
(64 ビット Arm v8 向けの Docker イメージと最小限主義のベース イメージのビルドに使用)linux-arm
(Raspberry Pi Model 2+ 上の Raspbian など、Arm で実行されている Linux ディストリビューション)linux-arm64
(Raspberry Pi Model 3+ 上の Ubuntu Server 64 ビットなど、64 ビット Arm で実行されている Linux ディストリビューション)linux-bionic-arm64
(Termux など、Android の bionic libc を使用したディストリビューション)
詳細については、.NET の依存関係と要件に関するセクションを参照してください。
macOS RID
macOS RID では、以前の "OSX" ブランドが使用されています。
osx-x64
(最小 OS バージョンは、macOS 10.12 Sierra です)osx-arm64
詳細については、.NET の依存関係と要件に関するセクションを参照してください。
iOS RID
ios-arm64
Android RID
android-arm64
関連項目
.NET