.NET RID 目录

RID 是运行时标识符的缩写。 RID 值用于标识应用程序运行所在的目标平台。 .NET 包使用它们来表示 NuGet 包中特定于平台的资产。 以下值是 RID 的示例:linux-x64win-x64osx-x64。 对于具有本机依赖项的包,RID 将指定在其中可以还原包的平台。

可以在项目文件的 <RuntimeIdentifier> 元素中设置一个 RID。 可以将多个 RID 定义为项目文件的 <RuntimeIdentifiers> 元素中的列表(以分号分隔)。 也可使用以下 .NET CLI 命令 通过 --runtime 选项使用它们:

表示具体操作系统的 RID 通常遵循以下模式:[os].[version]-[architecture]-[additional qualifiers],其中:

  • [os] 是操作系统/平台系统名字对象。 例如 ubuntu

  • [version] 是操作系统版本,使用的格式是以点 (.) 分隔的版本号。 例如 15.10

    版本不应为营销版本,因为营销版本通常代表该操作系统的多个离散版本,且具有不同的平台 API 外围应用。

  • [architecture] 是处理器体系结构。 例如:x86x64armarm64

  • [additional qualifiers] 进一步区分了不同的平台。 例如:aot

RID 图表

RID 图表或运行时回退图表是互相兼容的 RID 列表。

这些 RID 在 dotnet/sdk 存储库的 PortableRuntimeIdentifierGraph.json 中定义。 在此文件中,可以看到除基 RID 以外的所有 RID 均包含 "#import" 语句。 这些语句指示的是兼容的 RID。

在 .NET 8 之前,特定于版本的和特定于发行版的 RID 会定期添加到位于 dotnet/runtime 存储库中的 runtime.json 文件中的 Microsoft.NETCore.Platforms 包和 RID 图。 此图不再更新,并作为向后兼容性选项存在。 开发人员应使用非版本特定和非发行版特定的 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),则具有不同大小写的 RID 会导致问题,因为在构造输出路径等内容时,通常会使用该值。 例如,请考虑 Visual Studio 中的自定义发布向导,该向导依赖于解决方案配置管理器和项目属性中的信息。 如果解决方案配置传递无效值,例如 ARM64,而不是 arm64,则可能会导致 RID 无效,例如 win-ARM64

使用 RID

若要使用 RID,必须知道有哪些 RID。 有关最新版本和完整版本,请参阅 dotnet/sdk 存储库中的 PortableRuntimeIdentifierGraph.json

建议选择被视为“可移植”的 RID(即不绑定到特定版本或 OS 发行版)。 这意味着,可移植的 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 服务器 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

另请参阅