【发布时间】:2021-07-31 09:16:24
【问题描述】:
我使用 C#.NET 4.6 创建了一个 COM DLL,并且导出的类确实具有要作为 COM 接口公开的所有属性。它是使用 x64 平台目标构建的,并使用项目构建选项下的“注册 COM 互操作”标志进行注册。在 Microsoft Excel 的 VBA 64 位中,它可以毫无问题地使用。
但是,我还需要在 Delphi 7 应用程序中使用相同的 COM,但 Delphi 7 只接受 32 位 COM 引用。这个应用程序无法迁移到较新版本的 Delphi,所以我需要让这个 COM 组件也可以与 32 位客户端一起使用。
如果我针对 x86 平台构建相同的 C# DLL,它将在 Delphi 7 中可见并正常运行,但在 Microsoft Excel VBA 64 位客户端中将停止工作。
我知道让 32 位客户端与 64 位 COM 服务器一起工作可以使用代理和 WOW 注册表项完成,但即使遵循这些准则 (Hosting a .NET DLL as an Out-Of-Process COM Server (EXE)) 在 * 中创建额外的 Windows 注册表项HKLM\SOFTWARE\Wow6432Node* 它不起作用(我知道这是一个旧帖子,但认为它仍然有效)。
我正在运行 Windows 10 x64 机器。我错过了任何额外的步骤吗?任何提示将不胜感激!
谢谢!
【问题讨论】:
-
您是否考虑过将您的 COM 服务器重新实现为进程外 EXE 而不是进程内 DLL?
-
嗨@remy-lebeau,它必须是一个DLL,因为.NET 中还有其他客户端,并且在这些情况下,与直接.NET 引用相比,使用进程外COM 服务器的性能会很差如果我将此 DLL 转换为 EXE,这将是无效的。
-
我在很多情况下看到供应商同时提供 32 位和 64 位 dll 并让用户决定使用哪一个。
-
嗨@jdweng,是的,问题是如何在同一台机器上同时使两个 32/64 可用,而无需创建第二个组件。如果我先注册我的 DLL 的 32 位版本,然后注册 64 位版本,Windows 注册表将只能识别后者。
-
您应该能够同时注册 x86 和 x64 DLL,因为 COM 有两个注册表。如果您对此有任何疑问,请查看您的注册流程。
标签: c# vba delphi 32bit-64bit com-interop