从 .NET Framework 4 开始,公共语言运行时支持将 COM 类型的类型信息直接嵌入到托管程序集中,而无需托管程序集从互作程序集获取 COM 类型的类型信息。 由于嵌入类型信息仅包含托管程序集实际使用的类型和成员,因此两个托管程序集可能具有相同 COM 类型的非常不同的视图。 每个托管程序集都有不同的 Type 对象来表示其 COM 类型视图。 公共语言运行时支持接口、结构、枚举和委托的这些不同视图之间的类型等效性。
类型等效意味着从一个托管程序集传递到另一个托管程序集的 COM 对象可以转换为接收程序集中的相应托管类型。
注释
类型等效和嵌入式互作类型简化了使用 COM 组件的应用程序和外接程序的部署,因为无需使用应用程序部署互作程序集。 如果共享 COM 组件的开发人员希望早期版本的 .NET Framework 使用其组件,仍必须创建主互作程序集(PIA)。
类型等效
COM 类型的等效性支持接口、结构、枚举和委托。 如果以下所有条件都满足,COM 类型被视为等效:
类型是两个接口、两个结构、两个枚举或两个委托。
类型具有相同标识,如下节所述。
这两种类型都符合类型等效性的条件,如将 COM 类型标记为类型等效性 一节中所述。
类型标识
两种类型在其范围和标识匹配时被视为相同的标识,换句话说,如果它们都有 TypeIdentifierAttribute 属性,并且两个属性具有匹配的 Scope 和 Identifier 属性。 Scope 的比较不区分大小写。
如果类型没有 TypeIdentifierAttribute 特性,或者它具有 TypeIdentifierAttribute 未指定范围和标识符的属性,则仍可将该类型视为等效性,如下所示:
对于接口,使用 GuidAttribute 的值代替 TypeIdentifierAttribute.Scope 属性,并使用 Type.FullName 属性(即类型名称,包括命名空间)代替 TypeIdentifierAttribute.Identifier 属性。
对于结构、枚举和委托,使用包含程序集的 GuidAttribute 而不使用 Scope 属性,使用 Type.FullName 属性而不使用 Identifier 属性。
标记 COM 类型以实现类型等效
可以通过两种方式将类型标记为符合类型等效条件:
将 TypeIdentifierAttribute 属性应用于类型。
使类型成为 COM 导入类型。 如果接口具有 ComImportAttribute 属性,则接口是 COM 导入类型。 如果在其中定义接口、结构、枚举或委托的程序集具有 ImportedFromTypeLibAttribute 属性,则接口、结构、枚举或委托是 COM 导入类型。