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

Calling Managed C# COM Objects from C#

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

" Active X类型库...是从.NET程序集导出的,不能添加为引用。而是添加对.NET程序集的引用。"

任何帮助将不胜感激。


64位进程无法直接访问32位取消管理代码。在64位系统上,COM对象有2个域。一种用于64位进程,另一种用于32位进程。它们在注册表中具有不同的注册区域,因此,如果仅对32位Com对象进行注册,就不存在64位进程。现在,如果您有一个以ANY_CPU为目标的程序集,则CLR可以将其加载到64位或32位进程中。但是,如果将ANY_CPU程序集加载到64位进程中,那么仍然无法加载任何32位未完成的代码。该技术中提到的解决方案使用DCOM和IPC来创建从64位到32位代码的进程外调用。

使用WCF,您可以在.Net中轻松完成同一操作。您创建的32位WCF服务器进程访问您的32位托管代码。您的64位进程是WCF客户端,并调用32位服务器。您可以使用WCF支持的"命名管道"属性来避免网络堆栈。


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