【问题标题】:C# 64-bit COM component for both 32-bit app and 64-bit Microsoft Excel VBA clients适用于 32 位应用程序和 64 位 Microsoft Excel VBA 客户端的 C# 64 位 COM 组件
【发布时间】: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


【解决方案1】:

当您在项目设置中取消选中“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”还不足以注销它吗?

谢谢。

【讨论】:

    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 2020-07-28
    • 2021-03-06
    • 2016-02-22
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多