VBA-ActiveX无法为具有依赖项的.net dll创建对象
我已经编写了一个.Net库,它封装了一些需要与遗留系统交互的业务逻辑。此库的目的是公开COM接口,以便我可以使用VBA从Office应用程序调用它 我已经做了所有需要做的事情,使用带有/codebase/tlb标志的64位Regasm.exe注册了它。它在我的Office应用程序中可见,甚至在intellisense中显示。但是,我一直收到“ActiveX组件无法创建对象”错误 为了尝试确定COM接口的设置/配置中是否存在错误,我创建了一个单独的.Net库,作为解决方案的一部分,它只使用一个基本类和方法返回一个“Hellow World”。这实际上可以按预期工作,即我在VBA应用程序的“引用”对话框中注册它,并可以实例化它并运行“HelloWorld”方法 然后,我在新的basic VS项目中引用了我想要的项目(业务逻辑),并在这里调用了一个方法,然后在我的简单项目中调用了另一个方法以作为COM接口公开。我取消注册dll并按照上面的方法注册 在我的VBA应用程序中,我然后取消选择.tlb文件,关闭它,重新打开它,然后重新引用它,然后尝试运行代码。这就是我得到“ActiveX组件无法创建对象”的时候。我假设这与我的项目中的依赖DLL有关,但我不确定,因为错误的细节很少 我不知道我应该在这里做什么?我是否需要注册所有其他依赖dll,即我在VS项目中只引用了2或3个外部dll?有人能告诉我怎样才能找到更详细的信息,即哪一个是确切的违规dll “ActiveX组件无法创建对象”错误通常意味着查找程序集或其依赖项时出现问题,或者程序集不包含任何具有请求的ProgID的公共类。要获取有关程序集加载疑难解答的更多详细信息,我建议使用 一些需要检查的内容VBA-ActiveX无法为具有依赖项的.net dll创建对象,.net,vba,dll,com,activex,.net,Vba,Dll,Com,Activex,我已经编写了一个.Net库,它封装了一些需要与遗留系统交互的业务逻辑。此库的目的是公开COM接口,以便我可以使用VBA从Office应用程序调用它 我已经做了所有需要做的事情,使用带有/codebase/tlb标志的64位Regasm.exe注册了它。它在我的Office应用程序中可见,甚至在intellisense中显示。但是,我一直收到“ActiveX组件无法创建对象”错误 为了尝试确定COM接口的设置/配置中是否存在错误,我创建了一个单独的.Net库,作为解决方案的一部分,它只使用一个基本
- 那么您实际上使用的是64位版本的MS Office?(我一直认为32位版本仍然是最常用的版本,因为64位版本和32位版本在文件格式/Excel文档等方面的限制方面不兼容,但可能不再是这样了……?)
- 编译Visual Studio项目时选择了什么目标平台李>
- 是否在项目设置中选中了“注册COM互操作”复选框来编译项目李>
RegAsm/u/tlb
)程序集
为了防止这些情况发生,您应该在.NET代码中的COM公开类上显式设置ProgID GUID。还建议使用,并在程序集级别将其设置为false,仅在需要向COM公开的类型上显式设置为true
关于.NET依赖项的信息
您只需注册包含组件“入口点”的DLL,即从VBA调用的方法。不过,与任何类型的.NET程序集一样,.NET运行时也需要能够找到依赖项。这通常是通过将依赖项的副本保留在与入口点DLL相同的文件夹中来实现的。默认情况下,VisualStudio通常将程序集/项目引用的依赖项复制到输出文件夹,GAC中存在的程序集除外
如何使用Visual Studio调试器
从VBA调用.NET代码时,可以通过将Visual Studio调试器附加到正在运行的excel.exe
进程(debug>Attach to process
从菜单中)来调试.NET代码。确保在Excel进程的“类型”列中提到了“托管”,并且调试器将附加到该列(应该自动发生,除非您修改了设置)
如果Excel进程中没有提到“托管”,则表示Excel尚未加载程序集;尝试在创建COM对象的语句之后运行带有断点的VBA代码,然后再次尝试附加调试器
附加Visual Studio调试器后,您将可以访问有关正在进行的操作的更多信息。然后,无论何时抛出.NET异常,都可以让VS调试器中断,还可以添加断点并逐步完成.NET代码。“ActiveX组件无法创建对象”错误通常意味着查找程序集或其依赖项时出现问题,或者程序集不包含任何具有请求的ProgID的公共类。要获取有关asse故障排除的更多详细信息,请参阅
Dim simple as SimpleInterface.MyClass
Set simple = New SimpleInterface.MyClass
MsgBox simple.HelloWorld("Say Hello")