尝试从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?的主要内容,如果未能解决你的问题,请参考以下文章
从 Visual Studio 2012 调试 VB6 代码
从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类