RID 是运行时标识符的缩写。 RID 值用于标识应用程序运行所在的目标平台。
.NET 包使用它们来表示 NuGet 包中特定于平台的资产。 以下值是 RID 的示例:linux-x64、win-x64 或 osx-x64。
对于具有本机依赖项的包,RID 将指定在其中可以还原包的平台。
可以在项目文件的 <RuntimeIdentifier> 元素中设置一个 RID。 可以将多个 RID 定义为项目文件的 <RuntimeIdentifiers> 元素中的列表(以分号分隔)。 也可使用以下 --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 中定义。 在此文件中,可以看到除基 RID 以外的所有 RID 均包含 "#import" 语句。 这些语句指示的是兼容的 RID。
在 .NET 8 之前,特定版本和特定发行版的 RID 会定期添加到 runtime.json 文件中,该文件位于 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-x64
| \ / |
| 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/runtime。
建议选择被视为“可移植”的 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.ResolvingUnmanagedDll、AssemblyLoadContext.Resolving、AppDomain.AssemblyResolve。 它们可用于加载与当前平台对应的资产。
已知 RID
以下列表显示了一小部分用于每个 OS 的最常见 RID。 有关最新版本和完整版本,请参阅 存储库中的 dotnet/runtime。
Windows RID
win-x64win-x86win-arm64
有关详细信息,请参阅在 Windows 上安装 .NET。
Linux RID
-
linux-x64(大多数桌面发行版,如 CentOS Stream、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) -
linux-loongarch64(在 LoongArch64 上运行的 Linux 分发版)
有关详细信息,请参阅 .NET 依赖项和要求。
macOS RID
macOS RID 使用较早的“OSX”品牌。
-
osx-x64(最低 OS 版本为 macOS 10.12 Sierra) osx-arm64
有关详细信息,请参阅 .NET 依赖项和要求。
iOS RID
ios-arm64iossimulator-arm64iossimulator-x64
Android RID
android-arm64android-armandroid-x64android-x86