visual-studio - 为 COM 互操作注册 x64 程序集

标签 visual-studio com msbuild build-process com-interop

场景:我有一个包含两个 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/

相关文章:

c# - 由于奇怪的错误,无法在 Visual Studio 2008 C# Windows 窗体中看到设计器 View

visual-studio - 如何判断要在调试器中附加哪个 w3p 进程?

c++ - 拦截 COM dllhost.exe 调用

c# - msbuild 版本 - 必须具备的功能

msbuild - 您可以在项目列表上进行并行增量构建吗?

c++ - 在 Visual Studio 中使用 OpenBLAS LAPACKE

visual-studio - 调试 list 中包含 "uiAccess=true"的应用程序时出现 Visual Studio 2008 错误

c++ - C2594 : Ambiguous Conversion with COM Object

c# - 是否可以确定 COM 互操作类型中可选参数的默认值?

visual-studio-2010 - 如何告诉 TFS 部署包含在一个解决方案中的多个 web 应用程序?