【问题标题】:Trying to debug from C# into VB6 yields TYPE_E_CANTLOADLIBRARY?尝试从 C# 调试到 VB6 会产生 TYPE_E_CANTLOADLIBRARY?
【发布时间】:2019-02-18 03:38:15
【问题描述】:

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

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

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

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

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

发生了“System.InvalidCastException”类型的未处理异常 在 appname.exe 中 附加信息:

无法将“dllname.classnameClass”类型的 COM 对象转换为 接口类型'dllname._classname'。

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

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

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

为什么会出现这个错误?


此外:

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

BC30002 dllname.classname 未定义。

谢谢

【问题讨论】:

    标签: vb6 com-interop


    【解决方案1】:

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

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

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


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

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多