dotNET COM 初始化问题

dotNET COM Initialization Issues

提问人:WCP 提问时间:11/9/2023 最后编辑:Simon MourierWCP 更新时间:11/9/2023 访问量:43

问:

我有一个使用多个 .NET 6 COM 组件的旧应用程序。根据 COM 组件的加载顺序,某些组件将无法加载并出现错误 (0x800080A5)。

我已经上传了一个示例项目,该项目将导致此处的问题。

要点是有两个 COM 服务器,项目 1 和项目 2。如果项目 2 具有某些依赖项(在本例中),并且在项目 1 之后加载,则将导致此错误。似乎发生了一些只触发一次的初始化。CoreWCF.WebHttp

如果加载顺序颠倒,使项目 2 在项目 1 之前加载,则一切都可以正常加载。

. .net-core com

答:

1赞 Simon Mourier 11/9/2023 #1

如果使用 DebugView 等工具运行 exe,将看到以下输出:

The specified framework 'Microsoft.AspNetCore.App' is not present in the previously loaded runtime.

这是因为项目 ComProject2 由于对包的依赖性而隐式需要框架。Microsoft.AspNetCore.AppCoreWCF.WebHttp

出于某种原因,.NET Core 加载程序无法在此 COM 方案中自动加载其他框架(exe 不是 .NET Core 应用)。但是您可以对其进行配置,此处对此进行了更详细的描述:依赖于框架的部署模型

有多种方法可以修复它。一种解决方案是,在部署时,将生成文件的内容复制到 中,以强制第一个组件加载 Microsoft.AspNetCore.App 框架,因此其内容应为:ComProject2.runtimeconfig.jsonComProject1.runtimeconfig.json

{
  "runtimeOptions": {
    "tfm": "net6.0",
    "rollForward": "LatestMinor",
    "frameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "6.0.0"
      },
      {
        "name": "Microsoft.AspNetCore.App",
        "version": "6.0.0"
      }
    ]
  }
}

另一种解决方案是,如此所述,创建一个在 ComProject1 的根目录下命名的文件,其内容如下所示:runtimeconfig.template.json

{
  "frameworks": [
    {
      "name": "Microsoft.AspNetCore.App",
      "version": "6.0.0"
    }
  ]
}

enter image description here

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

评论

0赞 WCP 12/2/2023
一个小说明,如果使用 如果现有框架有一个条目,并且您正在合并一个条目,则在注册 regsvr32 时可能会导致问题。合并不会自动将这两者合并,因此它会在 json 中留下两个节点。runtimeconfig.template.jsonFrameworkFrameworks