在 VB6 应用程序中,C# dll 的 CreateObject 仅在 IDE 中失败并显示 "ActiveX component can't create object"

In VB6 application, CreateObject for a c# dll fails with "ActiveX component can't create object" in IDE only

我有需要在 VB6 中使用的 C# 程序集。我已经在以前的 machines/OS 上工作过,但是在我当前的 Windows 10 机器上,在 VB6/VS6 IDE 中调试时我无法让它工作。每当我点击这条线时:

Set interop = CreateObject("BTR.Core.Interop.Activator")

我收到“ActiveX 组件无法创建对象”。错误。

如果我运行编译的VB6应用程序,一切正常。所以这一定是关于 VB6/VS6 IDE.

某处的权限问题

我发现其他 post 提到要确保使用 32 位版本的 regasm,我已经尝试 regasmC:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe 都无济于事。

因为它在我 运行 编译的 VB6 应用程序时工作(并且因为应用程序和 VB6 应用程序都在以前的机器上工作),我认为这证明了将我的 C# dll 公开给 COM 的所有设置是正确,但如果有人认为相关,我很乐意挖掘更多细节。

我看到的唯一可疑之处是这个 post (Late binding run-time error in VB6 when creating an object from a .NET assembly) 讨论了在 运行 重燃后注册表中应该有什么。我的所有设置都在

处的 WOW6432NODE 键中

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{2942ED53-BBC4-311D-9840-1FE610885592}.

所以不确定是否存在某种 32/64 位冲突或什么。任何建议表示赞赏。

好吧,我找到了解决办法。我不确定这是不是正确的。但我发现其他与此问题类似的帖子讨论了使用 /tlb 参数的 运行 regasm 来创建类型库,然后在 VB6 中引用它。当我将应用程序部署到另一台机器时,我不想有那个参考,所以我有点忽略了这个建议。

最后,我决定尝试使用该参数并引用类型库,然后 VB6 IDE 调试成功了。

但是 奇怪的 部分(对我有好处)是,然后我删除了引用并且 VB6 IDE 继续工作。所以不知何故,在 VB6 中添加引用确实 'something' 使其在 IDE 中的 运行 时工作,即使在我删除了引用之后也是如此。

希望这可以帮助其他可能无法在新的 Windows 操作系统上维护 VB6 应用程序的人。