5

我需要后期绑定到 3.5 C# 应用程序中的第 3 方 VB6 COM 对象(以避免我们当前拥有的版本依赖关系)。提供的 dll 在大多数非后期绑定方式中都不能使用,因为一些错误会在我们尝试正常使用它时导致错误。目前,我们正在使用一个自定义的 VB6 包装器,它使事情非常特定于版本,但是我发现我可以使用后期绑定来访问属性和方法。现在,我正在尝试后期绑定事件,但是我读过的所有内容都说我需要从 COM 包装器的接口继承来创建所需的事件接收器。这是一篇这样的文章

所以,我的问题是是否可以在编译时不引用 dll 的情况下执行后期绑定事件处理?

更新

这是我在使用 VB6 包装器时遇到的错误(仍在积极更新中)。

  • 在 OleViewer 中,我得到

无法反编译所选项目 加载类型库/DLL 时出错。TYPE_E_CANTLOADLIBRARY ($80029C4A)

  • 在 Visual Studio 中,我得到:

无法确定 COM 引用“3rdPartyDLL”的依赖关系。加载类型库/DLL 时出错。(来自 HRESULT 的异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))

4

2 回答 2

1

这里

我发现当 IDL 包含另一个项目的 .tlb 类型库的 importlib 时会导致问题。

这似乎在一个 dll 和另一个 dll 之间创建了依赖关系。

如果缺少依赖的 dll,OLEView 拒绝显示依赖的 dll,这也表现为不允许 #import from C++ 代码。

因此,我会仔细查看相关 DLL 的 COM 依赖项,并确保它们也都已注册。

它还继续添加:

...因为两个 dll 是相互依赖的,所以来自每个组件的组件交互(通过方法签名上的接口声明)并#import从彼此的 typelib 中使用。

因此,除非两个目标 dll 都存在,否则都无法重建。正如您可以想象的那样,当您尝试从头开始完全重建项目时,这会导致一个可怕的问题。

我已经尝试将接口定义分成更小的 IDL 文件......


编辑:这是最近出现的这个问题的一个例子(我相信)。我有一个导出到 COM 的 C# 库。对该库进行了修改,改变了几个类的接口,但库 GUID 没有改变。另请参阅此处了解AutoDual正在使用的风险。

这是奇怪的部分 - VB6 DLL 是参考修改后的 C# DLL 重建的。它编译得很好。没有错误。但它的类型库已损坏 - OleView 无法打开它,以TYPE_E_CANTLOADLIBRARY. 要成功重新编译 VB6 DLL,必须更改 C# DLL GUID。

显然是 VB6/C# 互操作的一个陷阱。

于 2017-03-30T11:36:21.013 回答
0

该问题很可能是由您使用的平台引起的。我昨天刚遇到类似的问题。确保在后期绑定 x86/x64 COM 类型库时将项目平台设置为x86 / x64 。

这同样适用于oleview。使用 x86/x64 版本查看 x86/x64 类型库。(如果您在 x64 系统上,可能需要安装 x64 Windows SDK 才能获得正确的可执行文件)。

于 2013-02-12T10:09:29.860 回答