2012-10-10 143 views
5

我需要在3.5 C#应用程序中延迟绑定到第三方VB6 COM对象(以避免我们目前拥有的版本依赖关系)。由于某些在我们尝试正常使用时会导致错误的错误,因此提供的dll在大多数非后期方式中不会消耗。目前,我们正在使用一个自定义的VB6包装器,它使事情具有特定的版本,但是我发现我可以使用后期绑定来访问属性和方法。现在,我试图对事件进行后期绑定,但是我读过的所有内容都说我需要从COM包装器的接口继承来创建所需的事件接收器。 Here is one such article如何在没有接口的情况下绑定COM事件

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

UPDATE

以下是我与VB6包装(目前仍在积极更新)中的错误。

  • 在OleViewer,我得到

未能进行反编译选定的项目错误加载类型库/ DLL。 TYPE_E_CANTLOADLIBRARY($ 80029C4A)

  • 在Visual Studio我得到:

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

+0

我很好奇:当您尝试早期使用VB6对象时,看到的错误是什么?我写过很多VB6 COM组件,并且在任何其他环境中使用它们(只要客户端支持COM)从来没有遇到过任何问题。为什么你甚至会关心VB6组件的版本控制 - 是否由它的作者积极开发? – xxbbcc

+0

@xxbbcc它仍在积极开发中,我更新以显示错误 –

+1

@WhozCraig:VB6事件始终只基于IDispatch。 – wqw

回答

0

该问题最有可能是由你所使用的平台引起的。我昨天也遇到过类似的问题。请确保您在您的项目平台设置为/当你在后期绑定的x86/x64的COM类型库。

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

0

here

我发现,当IDL包含导入库 到其他项目的.tlb类型库的问题引起的。

这似乎创造一个DLL和其他之间的依赖关系。

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

所以我会仔细看一下有问题的DLL的COM依赖关系,并确保它们都登记为好。

还接着补充:

...因为这两个DLL是相互依存的,从每一个相互作用(通过对方法 签名接口声明) 组件和使用#import从对方的类型库。

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

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


编辑:这里是近期这个问题来了解(我相信)的例子。我有一个C#库导出到COM。对该库进行了修改,它改变了几个类的接口,但库GUID没有改变。也在使用中的see here about risks of AutoDual

这里是奇怪的部分 - VB6 DLL被重新引用修改后的C#DLL。 它编译得很好。没有错误。但它的typelib是腐败的 - OleView无法打开它,与TYPE_E_CANTLOADLIBRARY失败。更改C#DLL GUID是成功重新编译VB6 DLL所必需的。

显然是VB6/C#interop的一个缺陷。

相关问题