1

我需要迁移 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 接口。所以我做了和这里解释的一样的事情(例子取自上一个链接):

[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° 步骤 - 通过创建标准 COM+ OOP 应用程序(使用 dllhost 作为代理进程)将此 COM 组件配置为进程外 (OOP);

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

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


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

4

1 回答 1

3

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

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

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

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

于 2016-10-12T19:17:29.790 回答