从64位代码访问32位DLL

时间:2016-10-09 21:54:56

标签: c# dll com ipc out-of-process

我需要迁移一个32位的dll才能在64位C#(以及C ++)应用程序中使用它。 dll是用非托管delphi代码编写的。我无法重新编译DLL,唯一的方法是使用进程间通信(IPC)。我搜索了很长时间但发现的信息并不多。我找到的最佳指南在此链接中:Accessing 32-bit DLLs from 64-bit code

我按照本指南来实现我的目标,因为这个论坛经常引用。所以指南说明我必须做三个步骤:

1°STEP - 创建一个实现COM对象的32位组件,该对象加载并调用32位DLL,并将32位DLL接口公开为COM接口。所以我做了与解释here相同的事情(从前一个链接中取得的例子):

[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IGetMyString
{
   string GetMyString();
}

[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")]
[ProgId("CallPDW.Class1")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : IGetMyString
{
    string GetMyString()
    {
      ......
    }
}

然后我必须注册.NET COM程序集,所以我必须使用Regasm.exe,但我创建了Visual Studio安装和部署项目,构建一个MSI文件并使Regasm做同样的事情。然后我控制了注册表编辑器,我找到了HKEY,所以它的工作原理。 所以直到这一步都没问题或似乎没问题。

2°STEP - 通过创建标准COM + OOP应用程序(使用dllhost作为代理进程)为进程外(OOP)配置此COM组件;

3°STEP - 创建一个64位包装器DLL,它实现与之相同的接口 原始的32位DLL,导入上面创建的COM对象的COM接口, 将当前对暴露接口的调用转换为对COM对象接口的调用,传输调用参数,接收返回值和委托 他们给来电者;

问题在于2°和3°STEP我不知道如何实现,因为我没有在网上或论坛中发现任何关于此的内容。所以我需要帮助来实现步骤2°和3°。还可以链接到其他帖子等。 提前谢谢。

其他信息(2016年10月12日 - 晚上11:10): 此DLL通过两个接口将其功能公开给32位本机环境: 1.)带有函数指针的C / C ++头文件(WINAPI *) 2.)带P / Invoke的.NET接口

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。您已经创建并注册了COM可见包装器DLL,这是公开Delphi库方法所必需的。

由于您的x64进程无法调用此x86包装器,因此需要进行代理进程。但是,如果您不打算使用任何服务,将DLL转换为完整的COM+服务器是没有意义的。

相反,我建议将您的包装器DLL托管到默认的COM代理中。为此,请调用基于x86的OLE / COM对象查看器,它是Windows SDK的一部分。展开"所有对象"节点并选择COM可见类。从那里,切换到"实施"选项卡并检查"使用代理流程"。切换到"注册表"选项卡并确认" AppID"节点现在包含[DllSurrogate]条目。注意:如果您需要自动执行此步骤,则需要手动或通过设置过程自行将适当的值写入注册表。

您现在应该能够从x64主机创建COM可见包装类的实例。