.net 互操作IStream派生类–;冗余方法?

.net 互操作IStream派生类–;冗余方法?,.net,.net,我有一个.NET互操作,有三个接口“实现”了IStream,即。 [mscorlib]System.Runtime.InteropServices.ComTypes.IStream 他们还添加了一些自己的方法。每个接口也有一个类 我不得不做一些修改(往返),当我阅读.IL时, 我注意到这些IStream派生的接口和类是如何实现的。 所有的IStream方法都与其他方法一起声明 在Win32(_TLB单元)中,我不必这样做。派生自的接口, 在本例中,IStream只需声明其他方法。同样的 实现De

我有一个.NET互操作,有三个接口“实现”了IStream,即。 [mscorlib]System.Runtime.InteropServices.ComTypes.IStream 他们还添加了一些自己的方法。每个接口也有一个类

我不得不做一些修改(往返),当我阅读.IL时, 我注意到这些IStream派生的接口和类是如何实现的。 所有的IStream方法都与其他方法一起声明

在Win32(_TLB单元)中,我不必这样做。派生自的接口, 在本例中,IStream只需声明其他方法。同样的 实现DefaultInterface方法的类

这意味着在互操作中有六种不同的声明,包括所有的IStream方法。 这真的有必要吗?有没有办法避免这些看似多余的东西 声明

比尔姆

在Win32(_TLB单元)中,我不必这样做

嗯,你知道,它只是不像C#中那样明确。COM不支持实现继承,只支持接口继承。这意味着,当您实现一个coclass时,您必须提供coclass继承的所有接口的所有方法的实现。COM支持聚合,但这不是很有用

<> > C++语言模型作为纯抽象类接口。并且支持多重继承,在COM中非常方便。从接口继承只需要添加额外的方法,继承的抽象方法无需重复。就像C#中的抽象基类一样。所以这可能就是你“我不必这么做”的观察结果的来源

它在CLR语言中的工作方式不同,接口的行为类似于“true”接口,并且实现为存根,不要求方法出现在特定的v表插槽中。而且不支持多重继承。CLR本身为IUnknown和IDispatch提供了实现,无需在这些接口中重复这些方法。但是,如果您从一个非平凡的其他接口派生一个接口,那么您必须重复继承方法的声明,以便获得正确的v-table并与comv-table顺序完全匹配。当然,就像C++一样,你也必须实现它们。
这相当烦人,而且容易出错,但不可避免。当您拥有一个类型库时,很多这种痛苦就会消失,并且这些都可以自动生成。永远不要忽视从IDL文件中使用midl.exe生成一个声明的可能性,这样即使COM组件没有提供声明,也不需要C#声明。

我非常感谢您的解释,因为我无法从ECMA-335或ISO/IEC 23271或我在CIL上的任何其他文档中对其进行解读。我一直在寻找修剪脂肪的方法,但在这种情况下,我现在明白了istream方法是必要的。