当运行具有 运行时标识符(RID) 特定资产的应用程序时,主机将确定与运行它所在的平台相关的资产。 这适用于应用程序本身和 AssemblyDependencyResolver 使用的解析逻辑。
以前,主机会尝试在运行时计算 RID,然后读取 RID 图以确定哪些特定于 RID 的资产与计算的 RID 匹配或兼容。 现在,默认行为不会计算 RID 或使用 RID 图形。 相反,主机依赖于基于运行时本身的生成方式的已知 RID 列表。
以前的行为
以前,选择特定于 RID 的资产的过程是:
- 从根框架 的.deps.json 文件中读取 RID 图(Microsoft.NetCore.App)。
- 在运行时计算当前 RID,并尝试在 RID 图中找到它的条目。 如果不存在,检查回退 RID(在编译时内置于主机中)。
- 从 RID 图中找到的条目开始,查找与该 RID 匹配的资产。
- 针对 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,例如、linux
linux-musl
、osx
和win
。 对于专用用例,您可以使用NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver)或AssemblyLoadContext.ResolvingUnmanagedDll这样的API来实现自定义加载逻辑。
如果需要还原以前的行为,请在 runtimeconfig.json 文件中将后向兼容性开关 System.Runtime.Loader.UseRidGraph
设置为 true
。 将开关设置为 true
,以指示主机使用以前读取 RID 图的方式。 或者,您可以在项目文件中将UseRidGraph
MSBuild 属性设置为true
。 例如:
<PropertyGroup>
<UseRidGraph>true</UseRidGraph>
</PropertyGroup>