VBA - ActiveX 无法为具有依赖项的 .net dll 创建对象

格伦洪

我编写了一个 .Net 库,它封装了一些需要与遗留系统交互的业务逻辑。这个库的目的是公开一个 COM 接口,以便我可以使用 VBA 从 Office 应用程序调用它。

我已经完成了使用带有 /codebase /tlb 标志的 64 位 Regasm.exe 注册它所需的一切。它在我的 Office 应用程序中可见,甚至在智能感知中显示。但是,我不断收到“ActiveX 组件无法创建对象”错误。

为了尝试确定 COM 接口的设置/配置中是否存在错误,我创建了一个 sepearte .Net 库作为我的解决方案的一部分,只有一个基本类和方法来返回“Hellow World”。这实际上按预期工作,即我在 VBA 应用程序的“引用”对话框中注册它,并且可以实例化它并运行“HelloWorld”方法。

Dim simple as SimpleInterface.MyClass
Set simple = New SimpleInterface.MyClass

MsgBox simple.HelloWorld("Say Hello")

然后我在我的新基本 VS 项目中引用我想要的项目(业务逻辑)并调用这里的一个方法,然后在我的简单项目中创建另一个方法以公开为 COM 接口。我取消注册 dll 并按照上述方法进行注册。

在我的 VBA 应用程序中,我取消选择 .tlb 文件,关闭它,重新打开它,然后重新引用它,然后尝试运行代码。这是我收到“ActiveX 组件无法创建对象”的时候。我假设这与我的项目中的依赖 dll 有关,但我不确定,因为错误的细节很少。

我不确定我应该在这里做什么?我是否需要注册所有其他依赖的 dll,即我有大约 2 或 3 个外部 dll,我只是在 VS 项目中引用它们?有人可以告诉我如何才能找到更多详细信息,即哪个是确切的违规 dll?

主播

“ActiveX 组件无法创建对象”错误通常意味着定位程序集或其依赖项之一时出现问题,或者程序集不包含任何具有所请求 ProgID 的公共类。要获得有关程序集加载故障排除的更多详细信息,我建议使用程序集绑定日志查看器

需要检查的一些事项

  • 所以您实际上使用的是 64 位版本的 MS Office?(我一直认为 32 位版本仍然是最常用的版本,因为 64 位和 32 位版本在文件格式/Excel 文档等方面的限制方面不兼容,但也许这不是是不是这样了……?)
  • 你在编译 Visual Studio 项目时选择了什么目标平台?
  • 项目是否曾经在项目设置中选中“注册 COM Interop”复选框进行编译?

什么我得到在这里是这样的:是否有任何的可能性,你实际上是在建立/注册的错误的平台/位数(即不匹配您的MS Office安装的位数)?是否有正确位的旧注册,这可能解释了为什么您仍然在 VBA IDE 的“引用”对话框中看到类型库,尽管为错误的目标平台构建?

通过 COM 互操作公开 .NET 类时要记住的另一件大事

默认情况下,每次编译项目时,Visual Studio 都会为公开的类生成新的随机ProgID GUID这就是为什么您必须经历删除引用然后在 VBA IDE 中再次添加它们的麻烦,以便在重新编译您的 .NET 项目后再次工作。

不仅如此,它还会用大量过时的键使注册表混乱,除非您确保RegAsm /u /tlb在用新编译的版本覆盖之前始终取消注册 ( ) 程序集。

为防止出现这些情况,您应该使用.NET 代码中 COM 公开类上的ProgID 属性显式设置 ProgID GUID 还建议使用ComVisible 属性,并在程序集级别将其设置为 false,并仅在需要向 COM 公开的类型上显式设置为 true。

关于 .NET 依赖项

您只需注册包含组件“入口点”的 DLL,即您从 VBA 调用的方法。但是,.NET 运行时需要能够找到依赖项,就像它对任何类型的 .NET 程序集所做的一样。这通常是通过将依赖项的副本保存在与入口点 DLL 相同的文件夹中来实现的。Visual Studio 通常默认将依赖项复制到输出文件夹以用于程序集/项目引用,GAC 中存在的程序集除外。

如何使用 Visual Studio 调试器

通过将 Visual Studio 调试器附加到正在运行的excel.exe进程(Debug > Attach to Process从菜单),您可以在从 VBA 调用 .NET 代码时对其进行调试确保 Excel 进程的“类型”列中提到了“托管”,并且调试器将附加到该列(应该自动发生,除非您对设置进行了修改)。

如果 Excel 进程中未提及“托管”,则表示 Excel 尚未加载您的程序集;尝试在创建 COM 对象的语句之后立即使用断点运行 VBA 代码,然后再次尝试附加调试器。

附加 Visual Studio 调试器后,您将可以访问有关正在发生的事情的更多信息。然后,无论何时抛出 .NET 异常,您都可以让 VS 调试器中断,并且您还可以添加断点并逐步执行 .NET 代码。真的值得一看,如果你还没有的话。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ActiveX组件无法创建对象VBA运行时错误

如何修复VBA中的“执行错误429:ActiveX无法创建对象”错误

VBA:Acrobat运行时错误429;ActiveX组件无法创建对象

VBA CreateObject无法在64位Windows上创建ActiveX组件

Inno Setup-具有依赖项的外部.NET DLL

在 Excel VBA 中循环 ActiveX 对象

在VB6应用程序中,仅在IDE中,ac#dll的CreateObject失败,并出现“ ActiveX组件无法创建对象”

ActiveX组件无法创建对象--- Mac版Excel

Excel 中的“ActiveX 组件无法创建对象”错误

ActiveX 组件无法创建对象:PCOMM.autECLConnList

MSWord - ActiveX 无法调用对象

如何创建ActiveX控件命令按钮并将其设置为变量Excel VBA

从VB6 IDE调用Comwrapped Net代码失败,在Win7中出现“ ActiveX组件无法创建对象”,但在WinXP中没有

.NET 5.0 发布导致无法为 .NET Standard 2.0 依赖项找到 CS0006 dll

创建 Outlook 对象会生成 - 运行时错误“429”:ActiveX 组件无法创建对象

IE中无法调用OCX / ActiveX dll函数

在 VBA PPT 中调用 ActiveX 对象的位置 - 无效量词

错误429 ActiveX组件在使用自我创建引用时无法创建对象

使用CreateObject ActiveX组件无法创建带有已注册类库的对象

VBA对象浏览器未在我的.NET dll库中显示类成员

由于ActiveX元素,VBA代码无法执行(错误32809)

如何删除带有VBA名称的ActiveX按钮?

VBA / .NET:为答复创建Outlook规则

为什么每隔几次迭代都会出现此错误?“ ActiveX组件无法创建对象”

运行测试集时出现错误“ ActiveX组件无法创建对象”

分发 xlwings 驱动的 Excel 文件。“ActiveX 组件无法创建对象”错误

“无法将用户与前缀合并”尝试为具有依赖项的功能创建zip包

创建dll时找不到依赖项

在ASP.NET Core中创建具有依赖项的中间件功能