首页 > 解决方案 > 尝试从 C# 调试到 VB6 会产生 TYPE_E_CANTLOADLIBRARY?

问题描述

我有一个从一些 C# 代码访问的 VB6 DLL。

使用编译和注册的 VB6 DLL 没有问题。但是当我将 VB6 源代码加载到 VB6 IDE 并运行项目时,下一次运行 C# 代码将失败,并出现以下错误。

在 VB6 IDE 中停止正在运行的 DLL 将再次允许 C# 程序从已编译的 DLL 中工作。

VB6 DLL 以二进制兼容性编译。

我在 C# 中收到的错误消息是:

appname.exe 中出现“System.InvalidCastException”类型的未处理异常附加信息:

无法将类型为“dllname.classname Class ”的 COM 对象转换为接口类型“dllname”。_类名'。

此操作失败,因为 IID 为“{D8AB6D65-F5E7-4B9C-A039-67DDC630E5F7}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:

加载类型库/DLL 时出错。(来自 HRESULT 的异常:0x80029C4A ( TYPE_E_CANTLOADLIBRARY))。

具体来说,当 C# 代码尝试访问实际上来自底层 COM 对象的互操作对象的任何部分时,就会发生此错误。但是访问 .NETObject派生的东西,比如.ToString()在该对象上工作正常。

为什么我会收到此错误?


此外:

如果我在 VB6 代码未运行时编译 C# 代码,它构建得很好。但是当 VB6 代码运行时编译,我得到一个错误:

BC30002 dllname.classname 未定义。

谢谢

标签: vb6com-interop

解决方案


也许别人会有更深的理解,但这是我最终想通的:

  • 在这种情况下调试时以 ADMIN 身份运行 Visual Studio (.NET) 或 Visual Basic 6 会导致错误。在没有管理员权限的情况下运行 BOTH 即可。

难题是某些构建操作(特别是自动注册 COM DLL)需要管理员权限。这就是陷阱。最终,我不得不在两个工具的管理员/非管理员设置之间反复切换,以便进行代码测试修改......


注意 - 当我在程序是 VB6 EXE 调试到 C# 代码的不同场景中进行调试时,这从来都不是问题。一切都可以以管理员身份运行,没问题。


推荐阅读