我需要迁移 32 位 dll 以便在 64 位 C#(以及 C++)应用程序中使用它。该dll是用非托管delphi代码编写的。我无法重新编译 dll,唯一的方法是使用进程间通信 (IPC)。我搜索了很长时间,但没有找到太多相关信息。我找到的最好的指南是在这个链接中:从 64 位代码访问 32 位 DLL.
我遵循本指南来实现我的目标,因为这个论坛中经常引用它。所以指南解释说我必须采取三个步骤:
第 1 步 - 创建一个实现 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 步 - 通过创建标准 COM+ OOP 应用程序(使用 dllhost 作为代理进程),将此 COM 组件配置为进程外 (OOP);
第 3 步 - 创建一个 64 位包装 DLL,它实现与
原始32位DLL,导入上面创建的COM对象的COM接口,
将对公开接口的当前调用转换为对 COM 对象接口的调用,传输调用参数,接收返回值和委托
他们给来电者;
问题是 2° 和 3° 步骤我不知道如何实现,因为我在网络或论坛中没有找到任何关于此的信息。所以我需要帮助来实现步骤 2° 和 3°。也可以一些其他帖子的链接等。
提前致谢。
其他信息(2016 年 10 月 12 日 - 晚上 11:10):
该 DLL 通过两个接口将其函数公开给 32 位本机环境:
1.) 带有函数指针的 C/C++ 标头 (WINAPI*)
2.) 带有 P/Invoke 的 .NET 接口