为COM互操作注册x64程序集

4

场景:我有一个包含两个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 位开发机上正确注册的最简单方法是什么?

Tim,你自己有没有找到这个解决方案?我也遇到了类似的问题。 - Jeremy Mullin
2个回答

3
我们遇到了这个问题,并通过设置项目生成 x86 的程序集来解决它。当然,这并不是最优解,但我们也有几个本地的 32 位库,所以我们必须这样做。

这是一个解决方案,但我希望尽可能保持所有内容都是本机64位。随着64位系统迅速成为标准,我不想在32位上开发,然后在最终安装到64位系统时遇到令人不愉快的意外。 - Tim Long

1
我能够通过以下 KB 条目解决这个问题。基本上,我在项目构建设置中关闭了 COM 互操作的注册,并使用了后置构建命令:
"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

http://support.microsoft.com/kb/956933


谢谢Jeremy,那确实是一个解决方案。问题在于我们是一个由开发人员组成的团队,他们在32位和64位系统上混合工作。硬编码到64位RegAsm显然在32位系统上不起作用。我希望使用“任何CPU”,让Visual Studio自己想办法。所以现在我们将调试构建设置为x86。我们的构建服务器针对发布版本使用Any CPU,幸运的是它是一个32位服务器,因此没有注册问题。 - Tim Long
使用%windir%环境变量不能解决这个问题吗?在64位系统上,这将是64位regasm。在32位上,它将是32位的regasm,对吗?--算了,我只是在路径中添加了“Framework64”... - Jeremy Mullin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接