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

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

“Active X类型库…是从.NET程序集导出的,不能作为参考添加。而是添加对.NET程序集的引用。”

任何帮助将不胜感激。

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

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

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