场景:我有一个包含两个 C# 项目的项目,由于历史原因,它们必须使用 COM(通过 COM Interop)相互通信。 COM 服务器是一个进程内自动化对象(称之为“服务器”),而 COM 客户端是一个简单的 C# 控制台应用程序,它像这样加载服务器:
var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
var objLateBound = Activator.CreateInstance(objType);
如果在项目设置中启用了该选项,Visual Studio 会自动为 COM Interop 注册程序集,所以这就是我用来注册服务器的内容(我只对这里的开发人员体验感兴趣,安装是一个单独的问题)并且一切正常只要项目设置为生成 32 位代码或 COM 客户端是 32 位。
在 64 位系统上开发时会出现问题,并且两个项目都设置为为“任何 CPU”生成代码,这导致它们在 64 位模式下运行。这会产生以下错误:
"Retrieving the COM class factory for component with CLSID {6F597EDF-9CC8-4D81-B42E-1EA9B983AB02} failed due to the following error: 80040154."
经过一番调查,似乎 MSBuild 脚本只执行 32 位注册。它确实将 ProgID 连同其子项 CLSID 和正确的 classID 一起放入 64 位注册表部分。但是 CLSID{clsid} 的东西不存在。它仅在 WOW6432 子树中,用于 32 位。所以激活器不能检索类工厂,因为它找不到那个东西。
如果我得到这个问题的答案,我会对 SO 社区印象深刻,但这里有:
有没有其他人遇到过这个问题?你是怎么解决的?确保 COM Interop 程序集在 64 位开发机器上正确注册的最简单方法是什么?
最佳答案
我们遇到了这个问题,并通过设置项目来为 x86 生成程序集来解决它。当然,这是次优的,但我们也有几个 native 32 位库,所以无论如何我们都必须这样做。
关于visual-studio - 为 COM 互操作注册 x64 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1600585/