场景:我有一个包含两个C#项目的项目,由于历史原因,这两个项目必须使用COM(通过COM Interop)进行通信。 COM服务器是一个进程内自动化对象(称为“服务器”),而COM客户端是一个简单的C#控制台应用程序,它像这样加载服务器:
var objTypee = Type.GetTypeFromProgID("ProgID.Interop3264");
var objLateBound = Activator.CreateInstance(objType);
Visual Studio会自动为COM互操作注册程序集,如果该选项在项目设置中启用,因此我使用它来注册服务器(我只关心开发人员的体验,安装是另一个问题),只要项目设置为生成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 放入 64 位注册表节中,以及它的子键 CLSID 和正确的 classID。但是 CLSID{clsid} 东西不在那里。它只在 WOW6432 子树中,适用于 32 位。因此,激活器无法检索类工厂,因为它找不到该项。
如果我能得到这个问题的答案,我会对 SO 社区印象深刻,但是这里有:
有人遇到过这个问题吗?你是如何解决的?确保 COM 互操作程序集在 64 位开发机上正确注册的最简单方法是什么?