我有一个使用几个.NET6COM组件的遗留应用程序.根据COM组件的加载顺序,某些组件将无法加载并出现错误(0x800080A5).
我已经上传了一个示例项目,将导致问题here.
要点是有两个COM服务器,项目1和项目2.如果项目2有一定的依赖关系(在本例中为CoreWCF.WebHttp
),并且在项目1之后加载,则会导致此错误.似乎发生了一些只被触发一次的初始化.
如果颠倒加载顺序,使项目2在项目1之前加载,那么一切都将正常加载.
我有一个使用几个.NET6COM组件的遗留应用程序.根据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
包.
由于某些原因,在此COM方案中,.NET核心加载程序无法自动加载其他框架(可执行文件不是.NET核心应用程序).但你可以configure个,这里有更详细的描述:Framework-dependent Deployment Model
有多种方法可以修复它.一种解决方案是,at deployment time,将生成的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的S根目录下创建名为runtimeconfig.template.json
的文件,内容如下:
{
"frameworks": [
{
"name": "Microsoft.AspNetCore.App",
"version": "6.0.0"
}
]
}
在构建时(第一次需要重新构建),它将被合并到ComProject1.runtimeconfig.json
.