我有一个使用多个 .NET 6 COM 组件的旧应用程序。根据 COM 组件的加载顺序,某些组件将无法加载并出现错误 (0x800080A5)。
我已经上传了一个会导致问题的示例项目here。
要点是有两个COM服务器,项目1和项目2。如果项目2有一定的依赖关系(在本例中
CoreWCF.WebHttp
),并且在项目1之后加载,那么就会导致这个错误。似乎发生了一些只触发一次的初始化。
如果加载顺序相反,即项目 2 在项目 1 之前加载,那么一切都会正常加载。
如果您使用 DebugView 等工具运行 exe,您将看到以下输出:
The specified framework 'Microsoft.AspNetCore.App' is not present in the previously loaded runtime.
这是因为项目 ComProject2 隐含地需要
Microsoft.AspNetCore.App
框架,因为它依赖于 CoreWCF.WebHttp
包。
由于某种原因,.NET Core 加载程序无法在此 COM 场景中自动加载附加框架(exe 不是 .NET Core 应用程序)。但是您可以配置它,这里有更多详细信息:依赖于框架的部署模型
有多种修复方法。一种解决方案是,在部署时,将生成的
ComProject2.runtimeconfig.json
文件的内容复制到ComProject1.runtimeconfig.json
中,以强制第一个组件加载Microsoft.AspNetCore.App框架,因此它的内容应该是这样的:
{
"runtimeOptions": {
"tfm": "net6.0",
"rollForward": "LatestMinor",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "6.0.0"
}
]
}
}
另一个解决方案是,如here所述,在 ComProject1 的根目录下创建一个名为
runtimeconfig.template.json
的文件,其内容如下:
{
"frameworks": [
{
"name": "Microsoft.AspNetCore.App",
"version": "6.0.0"
}
]
}
并且它将在构建时(需要第一次重建)合并到
ComProject1.runtimeconfig.json
。