系列目录    【已更新最新开发文章,点击查看详细】 <https://www.cnblogs.com/SavionZhang/p/11229640.html>
从 .NET Framework 4 开始,公共语言运行时支持将 COM 类型的类型信息直接嵌入到托管程序集中,而不要求托管程序集从互操作程序集中获取
COM 类型的类型信息。 由于嵌入式类型信息仅包含托管程序集实际使用的类型和成员,因此两个托管程序集可能具有相同 COM 类型的不同视图。 
每个托管程序集都有不同的 Type <https://docs.microsoft.com/zh-cn/dotnet/api/system.type>
 对象来表示其 COM 类型视图。公共语言运行时支持接口、结构、枚举和委托等不同视图之间的类型等效性。

类型等效性意味着从一个托管程序集传递到另一个托管程序集的 COM 对象可以转换为接收程序集中适当的托管类型。

类型等效性和嵌入式互操作类型简化了使用 COM 组件的应用程序和加载项的部署,因为无需与应用程序一起部署互操作程序集。 如果共享 COM
组件的开发人员希望较早版本的 .NET Framework 使用其组件,他们仍须创建主互操作程序集 (PIA)。

类型等效性

COM 类型的等效性支持接口、结构、枚举和委托。 如果满足以下所有条件,则 COM 类型符合等效条件:

*
类型是两个接口、两个结构、两个枚举或两个委托。

*
类型具有相同标识,如下节所述。

*
两种类型都符合类型等效性,如针对类型等效性标记 COM 类型
<https://docs.microsoft.com/zh-cn/dotnet/framework/interop/type-equivalence-and-embedded-interop-types#marking-com-types-for-type-equivalence>
部分所述。

类型标识

范围和标识匹配时,确定两种类型具有相同标识,换句话说,如果它们各自具有 TypeIdentifierAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute>
 属性,并且两个属性都具有匹配的 Scope
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.scope>
 和 Identifier
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.identifier>
 属性。 Scope
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.scope>
的比较不区分大小写。

如果一个类型不具有 TypeIdentifierAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute>
 属性,或者如果它有一个不指定范围和标识符的 TypeIdentifierAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute>
 属性,仍可将该类型视为等效性,如下所示:

*
对于接口,使用 GuidAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.guidattribute>
 的值而不使用 TypeIdentifierAttribute.Scope
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.scope>
 属性,使用 Type.FullName
<https://docs.microsoft.com/zh-cn/dotnet/api/system.type.fullname>
 属性(即类型名称,包括命名空间),而不使用 TypeIdentifierAttribute.Identifier
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.identifier>
 属性。

*
对于结构、枚举和委托,使用包含程序集的 GuidAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.guidattribute>
 而不使用 Scope
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.scope>
 属性,使用 Type.FullName
<https://docs.microsoft.com/zh-cn/dotnet/api/system.type.fullname> 属性而不使用 
Identifier
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute.identifier>
 属性。

针对类型等效性标记 COM 类型

可通过两种方式将类型标记为符合类型等效性:

*
将 TypeIdentifierAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.typeidentifierattribute>
 属性应用于该类型。

*
将该类型设为 COM 导入类型。 若接口有 ComImportAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.comimportattribute>
 属性,则它是 COM 导入类型。 如果定义了其程序集具有 ImportedFromTypeLibAttribute
<https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.importedfromtypelibattribute>
 属性,则接口、结构、枚举或委托是 COM 导入类型。

请参阅

* IsEquivalentTo
<https://docs.microsoft.com/zh-cn/dotnet/api/system.type.isequivalentto>
* 在托管代码中使用 COM 类型
<https://docs.microsoft.com/previous-versions/dotnet/netframework-4.0/3y76b69k(v=vs.100)>
* 将类型库作为程序集导入
<https://docs.microsoft.com/zh-cn/dotnet/framework/interop/importing-a-type-library-as-an-assembly>
 
系列目录    【已更新最新开发文章,点击查看详细】
<https://www.cnblogs.com/SavionZhang/p/11229640.html>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信