我需要延迟绑定到3.5 C#应用程序中的第三方VB6 COM对象(以避免我们当前拥有的版本依赖性)。由于某些错误在我们尝试正常使用时导致错误,因此提供的dll在大多数非后期方式中都不可使用。目前,我们正在使用一个自定义的VB6包装器,它使得VERY特定于版本,但是我发现我可以使用后期绑定来访问属性和方法。现在,我试图延迟绑定到事件,但是我读到的所有内容都说我需要从COM包装器的接口继承来创建所需的事件接收器。 Here is one such article。
所以,我的问题是,是否可以在编译时没有对dll的任何引用来执行后期绑定事件处理?
更新
以下是我对VB6包装器的错误(仍在积极更新)。
无法反编译所选项目错误加载类型库/ DLL。 TYPE_E_CANTLOADLIBRARY($ 80029C4A)
无法确定COM引用的依赖关系 “3rdPartyDLL”。加载类型库/ DLL时出错。 (例外 HRESULT:0x80029C4A(TYPE_E_CANTLOADLIBRARY))
答案 0 :(得分:0)
问题很可能是由您使用的平台引起的。我昨天遇到了类似的问题。当您延迟绑定x86 / x64 COM类型库时,请确保将项目平台设置为 x86 / x64 。
同样适用于oleview
。使用x86 / x64版本查看x86 / x64类型库。 (如果您使用的是x64系统,则可能需要安装x64 Windows SDK才能获得正确的可执行文件。)
答案 1 :(得分:0)
来自here:
我发现当IDL包含importlib时会导致问题 到另一个项目的.tlb typelib。
这似乎在一个dll和另一个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。 编译好。没有错误。但它的类型库已损坏 - OleView无法打开它,失败了TYPE_E_CANTLOADLIBRARY
。为了成功重新编译VB6 DLL,必须更改C#DLL GUID。
显然是VB6 / C#interop的陷阱。