在类型库中只能看到public方法,并且COM客户端只能使用public方法。专用成员没有把它制成类型库,并且COM 客户端不能使用专用成员。类型的公共属性和领域被转换成IDL propget/propput类型。我们例子中的Temperature属性有被定义了的set以及get访问器,因此,propset 和propget中都没有这个属性。这里也有一个被称为_对象的接口,此接口被添加到了coclass。这个类型接口也包括其它4个方法。它们就是:
• ToString
• Equals
• GetHashCode
• GetType
这些方法补充到了默认类型接口,因为它是暗中从System.对象类型继承而来的。其中被补充到接口的每一个方法和属性得到一个DISPID,此DISPID是自动生成的。通过使用DispId属性,你可以用一个用户定义的DISPID覆盖这个DISPID。你将注意到ToString方法早已被指定了一个0的DISPID,以此暗示它是类型接口里的默认方法。这意味着如果你不考虑这个方法名称,就会调用这个ToString方法。
Dim objTemperature As New TemperatureComponent让我们检查推动隐式类型接口生成的方法。首先要看一下将ClassInterfaceType.AutoDual值应用到ClassInterface属性所带来的效果。
MsgBox objTemperature
[ClassInterface(ClassInterfaceType.AutoDual)]注意:被指定到ClassInterface 属性的值是ClassInterfaceType.AutoDual.这个选择告诉类型库生成工具怎样将类型接口 作为双重接口,怎样把所有类型信息(为了方法,属性等等以及与它们相应的调度ID)转移到类型库中。想象一下:如果决定将另一个公共方法增添到类型,将会发生什么。这样会转变被生成的类型接口 ,打破COM里的基本接口稳定性规则,因为虚拟函数表结构改变了。当使用这个组件时,晚期绑定客户端也会分享这种痛苦。因为增加了新的方法,从而生成了调度ID (DISPIDs),这样也会打破晚期绑定客户端。作为一个基本规则,使用ClassInterfaceType.AutoDual是有害的,因为它根本不了解COM译本.让我们看一下下一个你能为你的ClassInterface属性而设置值。用ClassInterfaceType.AutoDispatch的值标记你的ClassInterface属性会迫使类型库生成工具避免在类型库里生成类型信息。因此,如果你像下面所表示的一样,为你的TemperatureComponent类型标记了ClassInterface属性
public class TemperatureComponent
{
....
}
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public class TemperatureComponent
{
.....
}