尝试从C#调试到VB6会产生TYPE_E_CANTLOADLIBRARY?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试从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.classnameClass”类型的COM对象强制转换为接口类型“dllname._classname”。

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

加载类型库/ DLL时出错。 (HRESULT的例外情况:0x80029C4A(TYPE_E_CANTLOADLIBRARY))。

特别是当C#代码试图访问实际来自底层COM对象的互操作对象的任何部分时,会发生此错误。但访问像Object这样的.NET .ToString()派生的东西在该对象上运行良好。

为什么我收到此错误?


此外:

如果我在VB6代码没有运行的时候编译C#代码,那么构建正常。但是编译VB6代码运行时,我得到一个错误:

BC30002未定义dllname.classname。

谢谢

答案

也许其他人会有更深入的了解,但这是我最终想到的:

  • 在此方案中调试时,将Visual Studio(.NET)或Visual Basic 6作为ADMIN运行会导致错误。运行BOTH作为WITHOUT ADMIN权限然后它将工作。

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


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

以上是关于尝试从C#调试到VB6会产生TYPE_E_CANTLOADLIBRARY?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以同时调试 VB6 和 C++ COM dll?

从 Visual Studio 2012 调试 VB6 代码

从 C 调用用 VB6 制作的 DLL

从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类

试图在 VB6 的 C++ DLL 中显示 UI 会导致在 AfxGetResourceHandle 处断言

从 VB6 访问 C++ DLL 中的位图资源