如何在没有接口的情况下绑定COM事件

时间:2012-10-10 01:37:21

标签: c# vb6 .net-3.5 late-binding oleview

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

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

更新

以下是我对VB6包装器的错误(仍在积极更新)。

  • 在OleViewer中,我得到了
  

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

  • 在Visual Studio中,我得到:
  

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

2 个答案:

答案 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的陷阱。