【问题标题】:In VB6 application, CreateObject for a c# dll fails with "ActiveX component can't create object" in IDE only在 VB6 应用程序中,c# dll 的 CreateObject 失败,仅在 IDE 中出现“ActiveX 组件无法创建对象”
【发布时间】:2017-01-26 03:38:53
【问题描述】:

我有需要在 VB6 中使用的 C# 程序集。我已经在以前的机器/操作系统上运行过这个,但是在我当前的 Windows 10 机器上,在 VB6/VS6 IDE 中调试时我无法让它工作。无论何时,我都会打线:

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

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

如果我运行编译后的 VB6 应用程序,一切正常。所以这一定是VB6/VS6 IDE某个地方的权限问题。

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

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

我看到的唯一可疑之处是这篇文章 (Late binding run-time error in VB6 when creating an object from a .NET assembly) 谈到了运行 regasm 后注册表中应该包含的内容。我所有的设置都在

的 WOW6432NODE 键中

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

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

【问题讨论】:

  • 您确定 VBP 文件中的 COM 引用与编译应用程序时相同吗?如果 VBP 中的引用与 .NET 代码/程序集中指定的接口不匹配,则可能导致此错误。
  • 我有/没有参考,我正在做后期绑定 CreateObject。这就是为什么我对尝试添加 tlb 引用持怀疑态度的原因。很奇怪。

标签: c# vb6 com-interop regasm


【解决方案1】:

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

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

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

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

【讨论】:

  • 问题可能是TLB没有正确注册。后期绑定依赖于此,AFAIK。 regasm 步骤可能已经解决了这个问题。此外,有时 VB6 IDE 本身似乎会自动注册 DLL。所以这两件事中的一件一定已经完成了。
  • 本来应该是 VB6...我做了 regasm,但直到我创建 TLB 并在 VB6 中添加为引用时它才起作用。
猜你喜欢
  • 2013-07-27
  • 2015-11-12
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多