可以在COM / .NET互操作程序集与COM组件的更新版本中使用?

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

我调入从C#项目COM组件,经由予从COM DLL生成互操作程序集。 COM接口具有限定的DISPID和我已验证这些出现在生成的互操作组件。

根据经验,如果我的COM组件升级到新的版本,互操作的调用严重错误(因为如果它调用了错误的COM方法)。

这个预期,即该互操作性组件紧密结合,这是为产生的COM接口的具体版本?我曾天真地认为,只要在新的COM组件匹配了dispid的和函数原型,他们这样做,那就一切工作正常。

有没有告诉CLR使用的DISPID通过互操作程序集调用到COM组件时的一种方式,即各种各样的后期绑定? (我知道这是可以使用后期绑定使用反射式的C#代码,但是这将是比互操作程序集不太方便。)

c# .net com interop com-interop
2个回答
2
投票

我发现布赖恩长的文章.NET Interoperability: COM Interop

最普通的要求将是使用早期绑定来获得编译时类型检查和直接的(当然,直接,因为它得到)的COM对象虚表的调用。上面的[互操作组件]示例了这种方法。

造成“直接虚函数表叫”互操作程序集听起来就像它不会与接口的新版本工作(除非,也许,新方法只添加到接口,即到虚函数表的末尾结束?)。

也许有人可以证实或提供一个更完整的答案?


2
投票

当客户程序员使用后期绑定dispid的只使用。如果这就是你想要他做什么,那么你必须执行它。这是很容易做到的,应用界面上的[InterfaceType(ComInterfaceType.InterfaceIsDispatch)]属性。如果你不写一个接口,但只有一类,然后给它的[ClassInterface(ClassInterfceType.AutoDispatch)]属性。

任何企图通过客户端程序员使用危险的早期绑定现在失败了,他必须写后期绑定代码。不要指望一个感谢信。

唯一的另一种方法是删除[的Guid]属性你现在使用。这是非常危险的,让CLR自动生成全局唯一标识符,所以当你改变界面将自动出现不同。和客户端程序员调用得到完全错误的方法体面的E_NOINTERFACE错误信息。好了,不指望感谢信:)

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