.NET RID 目录
RID 是运行时标识符的缩写。 RID 值用于标识应用程序运行所在的目标平台。
.NET 包使用它们来表示 NuGet 包中特定于平台的资产。 以下值是 RID 的示例:linux-x64
、win-x64
或 osx-x64
。
对于具有本机依赖项的包,RID 将指定在其中可以还原包的平台。
可以在项目文件的 <RuntimeIdentifier>
元素中设置一个 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 会定期添加到 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-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/runtime
存储库中的 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.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
(使用 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-arm64
Android RID
android-arm64