适用于 32 位应用程序和 64 位 Microsoft Excel VBA 客户端的 C# 64 位 COM 组件

问题描述

我使用 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”不足以取消注册吗?

谢谢。