vb6 - 尝试从 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 未定义。
谢谢
解决方案
也许别人会有更深的理解,但这是我最终想通的:
- 在这种情况下调试时以 ADMIN 身份运行 Visual Studio (.NET) 或 Visual Basic 6 会导致错误。在没有管理员权限的情况下运行 BOTH 即可。
难题是某些构建操作(特别是自动注册 COM DLL)需要管理员权限。这就是陷阱。最终,我不得不在两个工具的管理员/非管理员设置之间反复切换,以便进行代码测试修改......
注意 - 当我在程序是 VB6 EXE 调试到 C# 代码的不同场景中进行调试时,这从来都不是问题。一切都可以以管理员身份运行,没问题。
推荐阅读
- php - 在 SqlServer 上工作但在 PHP 上不工作的查询(超过 4000 个字符的文本字段)
- angular - firestore 无法获取文档 ID QuerySnapshot.docChanges 已更改
- python - IndexError:使用 jupyter notebook 时列出的索引超出范围
- c++ - FFTW _GNUC_ 未定义为预处理器宏
- python-2.7 - 使用 beautifulsoup 无法获得结果
- c# - Xamarin Studio:System.InvalidOperationException
- validation - Vue js vee验证密码确认总是假的
- charts - Google 条形间隔图表选项
- php - 将变量转换为日期时间
- apache-camel - 在 jboss fuse esb 中配置延续超时