从C#调用托管C#COM对象

时间:2011-12-23 17:55:05

标签: c# com

我试图从C#调用C#COM对象。 我在C#中创建了一个类库,并使用tlbexe.exe导出了一个类型库。然后我使用regtlibv12.exe注册了类型库。但是,当我在Visual Studio中添加对COM对象的引用时,我收到一条错误消息:

“Active X类型库...是从.NET程序集导出的,无法添加为引用。请添加对.NET程序集的引用。”

非常感谢任何协助。

2 个答案:

答案 0 :(得分:3)

64位进程无法直接访问32位非管理代码。在64位系统上有4个COM对象域。一个用于64位进程,一个用于32位进程。它们在注册表中有不同的注册区域,因此如果您注册一个仅32位的Com对象,就64位进程而言是不存在的。现在,如果您有一个ANY_CPU目标的程序集,它可以由CLR加载到64位或32位进程中。但是,如果将ANY_CPU程序集加载到64位进程中,则仍然无法加载任何32位未损坏的代码。 artical中提到的解决方案使用DCOM和IPC来创建从64位到32位代码的进程外调用。

你可以在.Net中使用WCF做同样的事情。您创建一个32位的WCF服务器进程,可以访问您的32位托管代码。您的64位进程是WCF客户端,并调用32位服务器。您可以使用WCF支持的命名管道来避免网络堆栈。

答案 1 :(得分:2)

上面评论中提到的article适用于非托管(或本机)代码。这在.NET中不是问题,只要您将主机应用程序编译为AnyCPU(我认为在x86机器上使用x64程序集可能存在问题,但不确定)。您可以忽略32位DLL中的COM互操作(假设您不需要其他任何东西),只需从64位程序集中引用它(只需确保将目标体系结构更改为AnyCPU)。