系列目录 【已更新最新开发文章,点击查看详细】 <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>
热门工具 换一换