主机确定特定于 RID 的资产

当运行具有特定于运行时标识符 (RID) 的资产的应用程序时,主机会确定哪些资产与运行它的平台相关。 这适用于应用程序本身和 AssemblyDependencyResolver 使用的解析逻辑。

以前,主机会尝试在运行时计算 RID,然后读取 RID 图以确定哪些特定于 RID 的资产与计算的 RID 匹配或兼容。 现在,默认行为不会计算 RID 或使用 RID 图。 相反,主机依赖于基于运行时本身的生成方式的已知 RID 列表。

旧行为

以前,选择特定于 RID 的资产的过程是:

  1. 从根框架 (Microsoft.NetCore.App) 的 .deps.json 文件读取 RID 图。
  2. 在运行时计算当前 RID,并尝试在 RID 图中查找它的条目。 如果不存在,检查回退 RID(在编译时内置于主机中)。
  3. 从 RID 图中找到的条目开始,查找与该 RID 匹配的资产。
  4. 针对 RID 列表继续在 RID 图中查找条目,直到找到资产匹配项或列表结束。

如果 RID 图没有计算的 RID 或回退 RID,则 RID 资产未正确解析。

新行为

默认情况下,该过程不再依赖于 RID 图。 相反,它会根据主机的生成方式检查一组已知的可移植 RID。 例如:

Linux

  • linux-x64
  • linux
  • unix-x64
  • unix
  • any

Windows

  • win-x64
  • win
  • any

macOS

  • osx-x64
  • osx
  • unix-x64
  • unix

对于主机或运行时的非可移植生成,生成还可能设置首先检查的非可移植 RID。

引入的版本

.NET 8 预览版 5

中断性变更的类型

此更改会影响二进制兼容性,也是行为变更

更改原因

RID 图的维护和理解成本很高,要求 .NET 本身以一种脆弱的方式进行发行版感知。 .NET 团队和社区花费了大量的时间来更新该图并将此类更新向后移植到以前的版本。 长期目标是停止更新 RID 图,停止读取它,并最终删除它。 此中断性变更是迈向该目标的一步。

使用可移植 RID,例如 linuxlinux-muslosxwin。 对于专用用例,可将 NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver)AssemblyLoadContext.ResolvingUnmanagedDll 等 API 用于自定义加载逻辑。

如果需要还原以前的行为,请在 runtimeconfig.json 文件中将后向兼容性开关 System.Runtime.Loader.UseRidGraph 设置为 true。 将开关设置为 true 将指示主机使用以前读取 RID 图的行为。 或者,可以在项目文件中将 UseRidGraph MSBuild 属性设置为 true。 例如

<PropertyGroup>
  <UseRidGraph>true</UseRidGraph>
</PropertyGroup>

受影响的 API

另请参阅