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

问题描述 投票:2回答:1

我从一些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。

谢谢

vb6 com-interop
1个回答
2
投票

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.