我需要迁移 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 的接口