场景:我有一个项目包含两个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的程序集来解决它。当然,这不是最理想的,但我们也有几个原生的32位库,所以我们不得不这样做。

其他提示

我能够使用以下KB项解决此问题。基本上我关闭了在项目构建设置中注册COM interop,并使用了post-build命令:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)" 

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top