主机确定特定于 RID 的资产

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

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

以前的行为

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

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

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

新行为

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

Linux的

  • linux-x64
  • linux
  • unix-x64
  • unix
  • 任何

Windows操作系统

  • win-x64
  • 任何

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

另请参阅