【发布时间】: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