参考 COM+ dll
Reference COM+ dll
对于我的工作,我需要将 32 位 c++ dll 与 64 位 c# 程序一起使用。我想尝试使用 dll 作为包装器来执行此操作。
我目前所做的是我制作了一个 dll,它使用 dll 导入来公开 c++ dll 的功能,然后启用 COM+ 以使这些功能在 64 位中可用。
我面临的问题是使用这个 COM+ dll。为此,我遵循了 this documentation
我用强名称对其进行了签名、编译、使用 gacutil 进行注册,然后使用 Regsvcs 将其发送到 com+。但是当我想使用它时,我需要在我的 64 位应用程序中有一个关于它的参考。
我尝试添加引用,select COM,然后是我的 class,它告诉我:
the ActiveX type library was exported from a .net assembly and cannot be registered.
如果我尝试添加 tlb 文件,它会告诉我:
check that the file is accessible and this is an assembly or a valid COM component
如果我有 dll 作为参考,我会得到一个 badImageException。
我的电脑不是英文的,所以消息可能不准确。
您不能在 64 位进程中加载 32 位 DLL(反之亦然)。只有在 COM 服务器处于进程外(即可执行文件)的情况下,将其包装在 COM 周围才有帮助。如果它是进程内 COM 服务器(即 DLL),正如我从您的描述中了解到的那样,那是行不通的。您的 64 位进程将加载 64 位 COM 服务器,然后这将尝试加载 32 位 DLL,但会失败。您需要做的是将 COM 包装器更改为进程外服务器。这将 运行 在它自己的 32 位进程中。 32 位和 64 位进程之间通过适当的数据编组进行的通信是通过 COM 透明地完成的。
对于我的工作,我需要将 32 位 c++ dll 与 64 位 c# 程序一起使用。我想尝试使用 dll 作为包装器来执行此操作。
我目前所做的是我制作了一个 dll,它使用 dll 导入来公开 c++ dll 的功能,然后启用 COM+ 以使这些功能在 64 位中可用。
我面临的问题是使用这个 COM+ dll。为此,我遵循了 this documentation
我用强名称对其进行了签名、编译、使用 gacutil 进行注册,然后使用 Regsvcs 将其发送到 com+。但是当我想使用它时,我需要在我的 64 位应用程序中有一个关于它的参考。
我尝试添加引用,select COM,然后是我的 class,它告诉我:
the ActiveX type library was exported from a .net assembly and cannot be registered.
如果我尝试添加 tlb 文件,它会告诉我:
check that the file is accessible and this is an assembly or a valid COM component
如果我有 dll 作为参考,我会得到一个 badImageException。 我的电脑不是英文的,所以消息可能不准确。
您不能在 64 位进程中加载 32 位 DLL(反之亦然)。只有在 COM 服务器处于进程外(即可执行文件)的情况下,将其包装在 COM 周围才有帮助。如果它是进程内 COM 服务器(即 DLL),正如我从您的描述中了解到的那样,那是行不通的。您的 64 位进程将加载 64 位 COM 服务器,然后这将尝试加载 32 位 DLL,但会失败。您需要做的是将 COM 包装器更改为进程外服务器。这将 运行 在它自己的 32 位进程中。 32 位和 64 位进程之间通过适当的数据编组进行的通信是通过 COM 透明地完成的。