设为首页
加入收藏
联系我们
首页 基础教程 技术文档 实例分析 数 据 库 疑难杂症 ASP.NET 七夕许愿树 技术论坛
最新文章
  .NET上传图片加文字…
 在vs.net bate…
 C#中利用正则表达式实现…
 Visual C#的SQ…
 关于使用存储过程创建分页
 通用分页显示查询存储过程
 大数据量的分页
 什么是web.confi…
 ASP.NET 配置文件…
 对“三层结构”的深入理解…
 多个关键字的查询问题
 VB和C# 语法对比图 …
 C#基础全接触
 用C#压缩和修复Acce…
 C#中的类型相等与恒等(…
推荐文章
 关于C#中的REF和黓认…
 读书笔记c#高级编程 委…
 【算法】C#快速排序类
 Visual C#的SQ…
 C#中调用API
 Infragistics…
 C#接口转换
 C#读取设备信息
 用.net操作word
 C# MessageBo…
 Visual C#中的数…
 雅虎公司C#笔试题,看看…
 C#.NET使用NHib…
 .net学习之运算符重载…
 Visual C# 3.…
热门文章
 ADO.Net与ADO在…
 开发ASP.NET下的M…
 用C#+XMI技术进行U…
 什么是虚拟机?
 C#基础全接触
 C#中利用正则表达式实现…
 雅虎公司C#笔试题,看看…
 用Visual C# 2…
 C#学习第一天
 C#语言初级入门(1)
 VB和C# 语法对比图 …
 远程重启计算机(C#)
 什么是B/S三层?
 Visual C#的SQ…
 Visual C#常用函…
C#学习第三天
阅读正文 文字大小:增大 减小  文字行距:增大 减小   双击自动滚屏
本文由中国C#技术学习中心整理  如果你对本文有不明之处请到技术论坛讨论!

通用语言规范( CLS )——CLS定义了VOS中类型的子集,也定义了常规的用法.如果一个类库遵守CLS的规则,它确保类库可以在其它所有能实现CLS的编程语言上使用.
虚拟执行系统( VES )——这是VOS实时的实现.VES负责装入和执行为NGWS运得时编写的程序.

这四个部分一起组成了NGWS runtime架构.每一部分在下面小节中描述.

2.2.1 VOS类型系统

VOS类型系统提供丰富的类型系统,它打算支持多种编程语言的完全实施.所以,VOS必须都支持面向对象的语言和过程编程语言.

现在,存在着很多种近似但有点不兼容的类型.就拿整型当例子,在VB中,它是16位长,而在C++中,它是32位.还有更多的例子,特别是用在日期和时间以及数据库方面的数据类型.这种不兼容使应用程序的创建和维护不必要地复杂化,尤其当程序使用了多种编程语言时.

另一个<A href=http://cs.mimi163.net/cs/question.php>问题</A>是,因为编程语言之间存在着一些差别,你不能在一种语言中重用另一种语言创建的类型.( COM用二进制标准接口部分地解决了这个<A href=http://cs.mimi163.net/cs/question.php>问题</A> ). 当今代码重用肯定是有限的.

发布应用程序的最大障碍是各种编程语言的对象模型不统一.几乎每一方面都存在着差异:事件、属性、永久保存( persistence )等等.

VOS这里将改变 这种现象 .VOS定义了描述值的类型,并规定了类型的所有值所必须支持的一条合约.由于前面提到的支持面向对象和过程编程语言,就存在着两种值和对象.

对于值,类型存储于表述( representation )中,同样操作也在其中实行.对象更强大因为它显式地存于表述中.每一个对象都有一个区别于其它对象的识别号.支持不同的VOS类型在第四章 "C#类型"中提出.

2.2.2元数据

尽管元数据用于描述和引用由VOS类型系统定义的类型,但它还不能锁定到这个单个目标.当你写一个程序时,通过利用类型声明,你所声明的类型( 假定它们是数值类型或引用类型 )被介绍给NGWS runtime类型系统.类型声明在存于PE可执行文件内部的元数据中得到描述.

基本上,元数据用于各项任务:用于表示NGWS runtime用途的信息,如定位和装载类、 内存中这些类的事例、解决调用 、翻译IL为原始码、加强安全并设置运行时上下文边界.

你不必关心元数据的生成.元数据是由C#的"代码转IL编译器"( code-to-IL compiler,不是JIT编译器 )生成的.代码转IL编译器发送二进制元数据信息给PE文件,是以标准的方式发送的,不象C++编译器那样,为出口函数创建它们自己的修饰名字.

你从元数据和可执行代码并存所获得的主要优势为,有关类型的信息同类型自身固定在一起,不会遍布很多地方.同样有助于解决存在于COM中的版本<A href=http://cs.mimi163.net/cs/question.php>问题</A>.进一步地,你可以在相同的上下文中使用不同的版本库,因为库不仅被注册表引用,也被包含在可执行代码中的元数据引用.

2.2.3通用语言规范

通用语言规范( CLS )并不是虚拟对象系统( VOS )真正的一部分,它是特殊的.CLS定义了VOS中的一个类型子集,也定义了必须符合CLS的常规用法.

那么,对此有什么迷惑呢?如果一个类库遵守CLS规则,其它编程语言同样也遵守CLS规则,那么其它编程语言的客户也可以使用类库.CLS是关于语言的交互可操作性( interoperability ).因此,常规用法必须仅遵循外部可访问项目 ( externally visible items )如方法、属性和事件等等.

我所描述的优点是你可以做以下工作.用C#写一个组件,在VB中派生它,因加在VB中的功能是如此之强大,在C#中再次从VB类派生它.只要所有的外部可访问项遵守CLS规则,这样是可行的.
我在这本书中出示的代码不关心CLS协定.但在构建你的类库时要注意到CLS协定.我提供了表2.1,用以给类型和外部可访问项定义协定规则.

这个清单不完整.它仅包含一些很重要的项目.我不指出出现在本书中每一种类型的CLS协定,所以有个好主意:当你寻找CLS协定时,至少应该用浏览该表,以了解哪种功能有效.不要担心你不熟悉这章表中的每一个含义,在这本书中你会学到它们.

表2.1 通能语言规范中的类型和功能

bool
char
byte
short
int
long
float
double
string
object( 所有对象之母 )
Arrays( 数组 )

数组的维数必须是已知的( >=1 ),而且最小下标数必须为0.
要素类型必须是一个CLS类型.

类型( Types )

可以被抽象或隐藏.
零或更多的接口可以被实现.不同的接口允许拥有具有相同名字和签名的方法.
一个类型可以准确地从一个类型派生.允许成员被覆盖和被隐藏.
可以有零或更多的成员,它们是字段( fields )、方法、事件或者类型.
类型可以拥有零或更多个构造函数.
一种类型的可访问性可以是公共的或者对NGWS组件来说是局部的;但是,仅公共成员可以认为是类型接口的一部分.
所有的值型必须从系统值型继承.异常是一个枚举——它必须从系统枚举( System Enum )继承.

类型成员

类型成员允许隐藏或者覆盖另一种类型中的其它成员.
参数和返回值的类型都必须是 CLS 协定 类型.
构造函数、方法和属性可以被重载.
一个类型可以有抽象成员,但仅当类型不被封装时.

方法

一种方法可以是静态、虚拟或者实例.
虚拟和实例方法可以是抽象的,或者是一个实现.静态方法必须总拥有一个实现.
虚拟方法可能是最后的( 或者不是 ).

字段( Fields )

可以是静态或者是非静态.
静态字段可以被描述或只初始化.

属性

当获取和设置方法而不是使用属性语法时,属性可以公开.
获取的返回类型和设置方法的第一个参数必须是相同的CLS类型——属性的类型.
属性名字必须不同,不同的属性类型用于区分是不充分的.
由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为 get_PropertyName 和 set_PropertyName 的方法.
属性可以被索引.
属性访问必须遵循这种命名格式:get_ProName,set_PropName.

枚举( Enumerations )

强调类型必须是byte、short、int 或long.
每一个成员是一个枚举类型的静态描述字段.
一个枚举不能实现任何接口.
你允许给多字段设定相同的值.
一个枚举必须继承系统枚举( 隐含在C#中 )

异常

可以被引发和被捕获.
自定义异常必须继承系统异常.

接口

可需要实现其它接口.
一个接口可以定义属性、事件和虚拟方法.实现取决于派生类.

事件

增加和取消方法必须是都提供或者都没有 ,每一种方法采用一个参数,它是一个从系统代表元( System Delegate )派生下来的类.

自定义属性

可以仅使用下更类型:Type( 类型 ),char, char, bool, byte, short, int, long, float, double, enum ( 一种CLS 类型 ), and object.

代表元( Delegates )

可以被创建和被激活

标识符( Identifiers )

一个标识符的第一个字母必须来自一限制集.
通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符( 大小写不敏感 ).

2.2.4虚拟执行系统( VES )

虚拟执行系统实现了虚拟对象系统.通过实现一个负责NGWS runtime的执行引擎( execution engine,缩写EE )创建VES.这个执行引擎执行你用C#编写和编译的应用程序.

下列组件为VES的一部分.
1、中间语言( IL )——被设计为很容易受各种各样的编译器所兼容 .在该框架之外,C++、VB和C#编译器都能够生成IL.
2、装入受管代码——这包括解决内存中的名字、 表层类( laying out classes),并且创建JIT编译所必需的存根.通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性.
3、用JIT转换IL成原始代码——IL代码并不是设计成为一种传统的解释字节代码或树型代码,IL转换是真正的编译.
4、装入元数据、校验类型安全和方法的完整性
5、垃圾收集( GC )和异常处理——两者都是基于堆栈格式的服务.受管代码允许你动态地跟踪堆栈.要动态地识别各个堆栈框架,JITter或其它编译器必须提供一个代码管理器.
6、描绘和查错服务——两者都取决于由源语言编译器所生成的信息.必须发出两个映射:一个映射从源语言结构发到指令流中的地址,一个映射从地址发到堆栈框架中的位置.当执行从IL到原始代码的转换时,这些映射被重新计算.
7、管理线程和上下文,还有远程管理——VES为受管代码提供这些服务.
虽然这个清单并不完整,但它足以让你理解运行时基于的由VES提供的低层架构.肯定将会有专门讨论运行时的书,而这本书将稍为深入地挖掘各种话题.

2.3 小结

这一章,我带你逛了一回运行时的世界.我描述了当创建、编译和配置C#程序时它是如何工作的.你学会了中间语言( IL ),还有元数据是如何用于描述被编译为IL的类型.元数据和IL都用于JITter检测和执行你的代码.你甚至可以选择用哪一种JITter来执行应用程序.
在这一章的第二部分,涉及到了运行时为何按这种方式工作的理论.你学了虚拟对象系统( VOS )和组成它的那部分.对于类库设计者最为感兴趣的就是通用语言规范( CLS ),它为基于VOS的语言交互操作设定规则.最后,你看到了虚拟执行系统( VES )如何通过NGWS runtime实现VOS

本文由中国C#技术学习中心整理  如果你对本文有不明之处请到技术论坛讨论!

中国C#技术交流QQ群:6337034  10976424  9383681  35248582  35248645
版权所有:中国C#技术学习中心 Copyright © 20010-20012
建议浏览分辨率使用:1024*768分辨率
粤ICP备05002251号