我编写了一个 .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 的公共类。要获得有关程序集加载故障排除的更多详细信息,我建议使用程序集绑定日志查看器。
需要检查的一些事项
什么我得到在这里是这样的:是否有任何的可能性,你实际上是在建立/注册的错误的平台/位数(即不匹配您的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] 删除。
我来说两句