如何latebind COM事件,而不接口

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

我需要后期绑定到一个第三方VB6 COM对象在3.5 C#应用程序(以避免我们当前版本的依赖)。这是由于一些,当我们试图通常使用它,导致错误的bug提供了大多数非后期绑定的方式是不是消耗品的DLL。目前,我们正在使用自定义VB6包装,使事情变得非常特定版本的,但是我发现我可以用后期绑定访问的属性和方法。现在,我想后期绑定事件,但一切我读过说,我需要从COM包装的接口继承来创建所需的事件接收器。 Here is one such article

所以,我的问题是,是否有可能,而不必在编译时的任何参考DLL进行后期绑定事件处理?

UPDATE

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

  • 在OleViewer,我得到

无法编译选定的项目错误加载类型库/ DLL。 TYPE_E_CANTLOADLIBRARY($ 80029C4A)

  • 在Visual Studio我得到:

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

c# vb6 .net-3.5 late-binding oleview
2个回答
0
投票

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

这同样适用于oleview。使用的x86 / x64的版本,查看在x86 / x64类型库。 (也许你需要的,如果你是一个x64系统上,以获得正确executeable安装的Windows 64位SDK)。


0
投票

here

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

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

如果相关的DLL缺少OLEVIEW拒绝显示相关的DLL,其中还通过不从C ++代码允许#进口表现。

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

它也接着补充:

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

因此,除非这两个目标的DLL都存在,也不能重建。你可以想像,当你尝试完全重建项目的从无到有这将导致一个可怕的问题。

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


编辑:这里有一个最近这个问题来了解(我相信)的例子。我不得不出口到COM一个C#库。修改该库作了哪些改变几类的接口,但库GUID没有改变。此外see here about risks of AutoDual这是在使用中。

这里的奇数部分 - VB6的DLL重建引用修改后的C#DLL。它编译罚款。没有错误。但它的类型库已损坏 - OLEVIEW无法打开它,用TYPE_E_CANTLOADLIBRARY失败。更改C#DLL GUID是必要得到成功重新编译VB6 DLL。

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

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