我有一个带有三个接口的.NET互操作“实现”IStream,即 [mscorlib程序] System.Runtime.InteropServices.ComTypes.IStream 他们添加了一些自己的方法。每个接口也有一个类。
我不得不做一些修改(圆形跳闸),因为我正在阅读.IL, 我注意到这些IStream派生的接口和类是如何实现的。 所有的IStream方法都与其他方法一起声明。
在Win32(_TLB单元)中,我不必这样做。一个接口派生自, 在这种情况下,IStream只需要声明其他方法。同样的 实现DefaultInterface方法的类。
这意味着在interop中有六种不同的声明,包括所有的IStream方法。 这真的有必要吗?有没有办法避免让所有这些看似多余 声明?
bilm
答案 0 :(得分:1)
在Win32(_TLB单元)中我不必这样做
嗯,你这样做,它不像C#中那样明确。 COM不支持实现继承,只支持接口继承。这意味着当您实现一个coclass时,您必须提供所有的所有方法的实现,这些方法是coclass继承的接口。 COM支持聚合,但这不是很有用。
C ++语言将接口建模为纯抽象类。并且支持多重继承,在COM中非常方便。从接口继承只需要添加额外的方法,继承的抽象方法就会出现而不必重复它们。就像他们在C#中使用抽象基类一样。所以这可能是你“我不必这样做”观察的地方。
它在CLR语言中的工作方式不同,接口的行为类似于“真实”接口,并且实现为存根,而不要求方法存在于特定的v-table插槽中。并且不支持多重继承。 CLR本身为IUnknown和IDispatch提供了实现,无需重复这些接口中的方法。但是,如果从非平凡的其他接口派生接口,则必须重复继承方法的声明,以使v-table正确并与COM v-table顺序完全匹配。当然,就像在C ++中一样,你也必须实现它们。
这很烦人且容易出错,但不可避免。当你有一个类型库时,很多这种痛苦都会消失,而这一切都可以自动生成。永远不要忽视从IDL文件生成midl.exe的可能性,因此您不需要C#声明,即使COM组件没有提供。