我有一个使用几个.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"
    }
  ]
}

enter image description here

在构建时(第一次需要重新构建),它将被合并到ComProject1.runtimeconfig.json.

.net相关问答推荐

Npgsql Minimum Pool Size 似乎没有被考虑在内

在 Rx 中,处理线程安全是否是消费者(IObserver)的责任?

使用 Task.WhenAll 但需要跟踪每个单独的 Task 的成功

使用字典作为数据源绑定组合框

是否可以模拟 .NET HttpWebResponse?

如何以编程方式判断类型是 struct 还是类?

app.config 文件和 XYZ.settings 文件有什么区别?

无法加载文件或程序集WebGrease,版本=1.5.1.25624,Culture=neutral,PublicKeyToken=31bf3856ad364e35或其依赖项之一

如何在 .NET 中将字符串转换为字节数组?

读取方法的属性值

如何使用 NUnit(或可能使用另一个框架)测试异步方法?

InternalsVisibleTo 属性不起作用

C# 编译为 32/64 位,或任何 cpu?

如何在我的 C# 程序的面板中运行另一个应用程序?

在 C# 中与块等效?

X509Certificate 构造函数异常

风格上的差异:IDictionary vs Dictionary

什么是 ToString("N0") 格式?

如何使用 DateTime 指定一天中的最晚时间

如何重新启动我的 C# WinForm 应用程序?