问题描述
我使用 C#.NET 4.6 创建了一个 COM DLL,并且导出的类确实具有作为 COM 接口公开的所有属性。它是使用 x64 平台目标构建的,并使用项目构建选项下的“注册 COM 互操作”标志进行注册。在 Microsoft Excel 的 64 位 VBA 中,它可以毫无问题地使用。
但是,我还需要在 Delphi 7 应用程序中使用相同的 COM,但 Delphi 7 只接受 32 位 COM 引用。此应用程序无法迁移到更新版本的 Delphi,因此我需要使此 COM 组件也适用于 32 位客户端。
如果我针对 x86 平台构建相同的 C# DLL,它将在 Delphi 7 中可见并正常运行,但在 Microsoft Excel VBA 64 位客户端中将停止工作。
我知道使用 Surrogates 和 WOW 注册表项可以使 32 位客户端与 64 位 COM 服务器一起工作,但即使遵循这些准则 (Hosting a .NET DLL as an Out-Of-Process COM Server (EXE)) 在 *HKLM\SOFTWARE\Wow6432Node* 它不起作用(我知道这是一个旧帖子,但认为它仍然有效)。
我正在运行 Windows 10 x64 机器。我错过了任何额外的步骤吗?任何提示将不胜感激!
谢谢!
解决方法
当您在项目设置中取消选中“Register for COM Interop”时,“AnyCPU”似乎可以解决问题。
为了在用户的机器上注册它,我使用管理员权限运行它:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /tlb /codebase "C:\MyCOM.dll"
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /tlb /codebase "C:\MyCOM.dll"
然后,删除(也作为管理员):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe "C:\MyCOM.dll" /u
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "C:\MyCOM.dll" /u
但是,注册表中似乎留下了一些条目。
“/u”不足以取消注册吗?
谢谢。