.NET RID 目錄

RID 是執行階段識別項的縮寫。 RID 值是用來識別應用程式執行所在的目標平台。 .NET 套件會使用它們來代表 NuGet 套件中的平台特定資產。 下列值是 RID 的範例:linux-x64win-x64、 或 osx-x64。 針對具有原生相依性的套件,RID 也可指定能在哪些平台上還原套件。

單一 RID 可在您專案檔的 <RuntimeIdentifier> 元素中設定。 可以在專案檔的 <RuntimeIdentifiers> 元素中,將多個 RID 定義為以分號分隔的清單。 也可以透過以 --runtime 選項搭配下列 .NET CLI 命令來使用:

代表具體作業系統的 RID 通常遵循 [os].[version]-[architecture]-[additional qualifiers] 這個模式,其中:

  • [os] 是作業/平台系統 Moniker。 例如: ubuntu

  • [version] 是作業系統版本,使用以點分隔 (.) 的版本號碼表示。 例如: 15.10

    版本不應為行銷版本,因為行銷版本通常代表作業系統的多個個別版本,且具有不同平台 API 介面區。

  • [architecture] 處理器架構。 例如:x86x64armarm64

  • [additional qualifiers] 進一步區分不同平台。 例如: aot

RID 圖表

RID 圖表或執行階段後援圖形是與彼此相容的 RID 清單。

這些 RID 定義於 dotnet/sdk 存放庫的 PortableRuntimeIdentifierGraph.json 中。 在此檔案中,您可以看到所有 RID (基底項目除外) 都包含 "#import" 陳述式。 這些陳述式指出相容的 RID。

在 .NET 8 之前,版本特定和發行版本特定的 RID 已定期新增至 Microsoft.NETCore.Platforms 套件和 runtime.json 檔案的 RID 圖表中 (位於 dotnet/runtime 存放庫)。 此圖表已不再更新,且會以回溯相容性選項的形式存在。 開發人員應該使用非版本特定和非發行版本特定的 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 必須完全符合目錄,包括大小寫。 使用不同大小寫的 RID 會導致 OS 區分大小寫時發生問題,例如 Linux,因為建構輸出路徑之類的專案時通常會使用值。 例如,請考量 Visual Studio 中的自訂發佈精靈,該精靈依賴解決方案設定管理員和專案屬性的資訊。 例如,如果解決方案設定傳遞不正確值,ARM64 而不是 arm64,可能會導致不正確 RID,例如 win-ARM64

使用 RID

若要使用 RID,必須先了解有哪些 RID 存在。 如需最新完整版本,請參閱 dotnet/sdk 存放庫中的 PortableRuntimeIdentifierGraph.json

建議選擇被視為「可攜式」的 RID (也就是未繫結至特定版本或 OS 發行版本的 RID)。 這表示可攜式 RID 應該用於建置平台特定的應用程式,以及建立具有 RID 特定資產的 NuGet 套件

從 .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.ResolvingUnmanagedDllAssemblyLoadContext.ResolvingAppDomain.AssemblyResolve。 這些可用來載入對應至目前平台的資產。

已知的 RID

下列清單顯示用於每個 OS 的一小部分最常見 RID。 如需最新完整版本,請參閱 dotnet/sdk 存放庫中的 PortableRuntimeIdentifierGraph.json

Windows RID

  • win-x64
  • win-x86
  • win-arm64

如需詳細資訊,請參閱 .NET 相依性和需求

Linux RID

  • linux-x64 (大部分的桌面發行版本,如 CentOS、Debian、Fedora、Ubuntu 和衍生版)
  • linux-musl-x64 (使用 musl 的輕量發行版本,如 Alpine Linux)
  • linux-musl-arm64 (用於建置 64 位元 Arm v8 和極簡基礎映像的 Docker 映像)
  • linux-arm (在 Arm 上執行的 Linux 發行版本,例如 Raspberry Pi Model 2+ 上的 Raspbian)
  • linux-arm64 (在 64 位元 Arm 上執行的 Linux 發行版本,例如 Raspberry Pi Model 3+ 上的 Ubuntu Server 64 位元)
  • linux-bionic-arm64 (使用 Android bionic libc 的發行版本,例如 Termux)

如需詳細資訊,請參閱 .NET 相依性和需求

macOS RID

macOS RID 使用較舊的 "OSX" 商標。

  • osx-x64 (最低 OS 版本為 macOS 10.12 Sierra)
  • osx-arm64

如需詳細資訊,請參閱 .NET 相依性和需求

iOS RID

  • ios-arm64

Android RID

  • android-arm64

另請參閱