C#4.0新增功能04 嵌入的互操作类型
从 .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 导入类型。
请参阅
C#4.0新增功能04 嵌入的互操作类型的更多相关文章
- C#3.0新增功能04 扩展方法
连载目录 [已更新最新开发文章,点击查看详细] 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型 ...
- C#4.0新增功能01 动态绑定 (dynamic 类型)
连载目录 [已更新最新开发文章,点击查看详细] C# 4 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像 ...
- C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点
C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点 第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它 ...
- C#2.0新增功能06 协变和逆变
连载目录 [已更新最新开发文章,点击查看详细] 在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. 以下代码演示分配兼容性.协 ...
- C#基础拾遗系列之二:C#7.0新增功能点
第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 ...
- C#7.0新增功能点
原文地址: https://www.cnblogs.com/runningsmallguo/p/8972678.html 第二部分:C#7.0新增的功能 (1)数字字面量的提升: C#7中的数字文字 ...
- C#7.0 新增功能
连载目录 [已更新最新开发文章,点击查看详细] C# 7.0 向 C# 语言添加了许多新功能 01 out 变量 支持 out 参数的现有语法已在此版本中得到改进. 现在可以在方法调用的参数列表 ...
- C#2.0新增功能01 分布类与分部方法
连载目录 [已更新最新开发文章,点击查看详细] 分部类型 拆分一个类.一个结构.一个接口或一个方法的定义到两个或更多的文件中, 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组 ...
- 说说C# 8.0 新增功能Index和Range的^0是什么?
前言 在<C# 8.0 中使用 Index 和 Range>这篇中有人提出^0是什么意思?处于好奇就去试了,结果抛出异常.查看官方文档说^0索引与 sequence[sequence.Le ...
随机推荐
- 从wireshark中学网络分析(一)
http://blog.csdn.net/nk_test/article/details/56509688 http://blog.csdn.net/nk_test/article/details/5 ...
- 查看SharePoint文档库是,显示层次目录,可以点击返回层次
在sharepoint 2013中,Documnet library(文档库)包含多层文件夹,当进入到文件夹后,返回指定层次了(例如返回上一层),需要用浏览器的返回. 使用起来不方便,而且浏览器的返回 ...
- Ubuntu下使用Docker搭建MySQL步骤备忘
docker 安装和 pull MySQL镜像这里就不介绍了,很多介绍,建议去docker官方网站查看. 本文主要介绍MySQL container 运行起来之后的一些配置 在往下看之前,确保 doc ...
- <iOS小技巧> 昵称格式判断
一.使用方式 + 如下代码块功能:判断字体,判断字体输入格式 NSString *firstStr = [name substringToIndex:1]; NSArray *num ...
- QList使用下标[index]才可以获得可修改的item的引用(估计QStringList也是如此)
QList算是最常用的集合了,今儿偶然间需要修改QList中的值,结果郁闷了.QList中提供了replace函数来替换item,但不是修改.而at().value()操作均返回的是const的ite ...
- 条款09:绝不在构造和析构过程中调用virtual函数
不该在构造函数和析构函数期间调用virtual函数,这一点是C++与jave/C#不同的地方之一. 假设有一个class继承体系,用来模拟股市交易如买进.卖出的订单等等.这样的交易一定要经过审计,所以 ...
- 【linux杂谈】跟随大牛进行一次服务器间通讯问题的排查
发现应用记录日志内,出现网络访问延迟较大的情况. 此类问题较为常见,特别是之前参与辅助一个朋友项目运维的过程中,经常因为网络访问延迟较大,朋友认为是遭到了ddos攻击或者是cc攻击.网络访问延迟较大常 ...
- AIX/Linux/HP-UX查看CPU/内存/磁盘/存储命令
1.1 硬件环境验证方式 硬件环境主要包括CPU.内存.磁盘/存储.网络设备(如F5等).系统特有设备(如密押设备等)等,其中网络设备和系统特有设备由网络管理员或项目组提供为准,本节主要关注CP ...
- 你竟然没用 Maven 构建项目?
一年前,当我和小伙伴小龙一起做一个外包项目的时候,受到了严重的鄙视.我那时候还不知道 Maven,所以搭建项目用的还是最原始的方式,小龙不得已在导入项目的时候花了很长时间去下载项目依赖的开源类库. 出 ...
- iOS开发(5):设备唯一标识与全局变量
这里记录两个iOS开发中经常用到的知识点,一个是唯一标识,一个是全局变量. (1)唯一标识 唯一标识一台设备(比如iPhone.iPad等)是一个基本的实现与业务上的需求,因为这个唯一标识在许多场景都 ...