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

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库,作为解决方案的一部分,它只使用一个基本

我已经编写了一个.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的公共类。要获取有关程序集加载疑难解答的更多详细信息,我建议使用

一些需要检查的内容

  • 那么您实际上使用的是64位版本的MS Office?(我一直认为32位版本仍然是最常用的版本,因为64位版本和32位版本在文件格式/Excel文档等方面的限制方面不兼容,但可能不再是这样了……?)
  • 编译Visual Studio项目时选择了什么目标平台
  • 是否在项目设置中选中了“注册COM互操作”复选框来编译项目
我想说的是:是否有可能您实际构建/注册了错误的平台/位(即,与MS Office安装的位不匹配)?是否存在正确位的旧注册,这可能解释了为什么尽管为错误的目标平台构建,您仍然可以在VBA IDE的“引用”对话框中看到类型库

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

默认情况下,每次编译项目时,VisualStudio都会为公开的类生成新的random。这就是为什么在重新编译.NET项目后,必须先删除引用,然后再将它们重新添加到VBA IDE中,以使其重新工作的原因

不仅如此,它还会在注册表中塞满大量过时的键,除非您确保在使用新编译的版本覆盖程序集之前始终注销(
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")