通用类型系统CTS(IL可利用所有特性,其他为其子集)
CTS规范描述类型的定义和行为。
CTS规定一个类型可以包含0个或多个成员。(字段,方法,属性,事件)
还定义了类型可见性和访问类型成员的一些规则(private,family,assembly等)
CTS建立了以程序集为类型可见性边界的规则,而CLR实现了这种可见性规则。
CTS还定义了诸多规则来管理类型继承,虚函数,对象生存期等事项。
CTS定义了类型的行为,故类型的行为是完全相同的,与语言无关的。
CTS仅支持单继承,故不支持C++的多继承。
CTS规定所有类型都必须继承自Object
////////////////////////////////////////
通用语言规范CLS(所有语言必须支持的一个最小特性集合)
如果希望创建的类型可以被其他语言方便的访问,只能使用语言中那些对其他语言来说也可用的特性。为了解决这个问题,有了CLS。
CLS为编译器厂商详细描述了面向CLR的编译器必须支持的一个最小特性集合。
CLS定义了可以被任何与CLS兼容的编程语言访问到的,外部可见的类型和方法所遵守的规则。
在CLR中类型的每个成员或者是一个字段,或者是一个方法。
编译器对于其他额外抽象(例如事件,委托,构造器,属性等)在源代码中遇到这些构造时将其翻译成字段或方法。这样CLR和其他的编程语言才能访问它们。
///////////////////////////////////////////////////////////
CLR的特性:线程,异常等可用于所有面向CLR的语言。
CLR对开发人员使用何种语言(面向CLR的)一无所知。
编译器可看做是一个语法检查器和“正确代码”的分析器。无论何种语言,最后都生成结果是一个托管模块。
托管模块:一个需要CLR才执行的标准PE文件。
其组成:
1.PE表头。包括文件类型(GUI,CUI或者DLL)还包括时间标记记录文件创建时间。对于包含本地CPU代码的模块,该表头还会有一些本地CPU代码的信息。(对于仅包含IL代码的模块,该PE表头会被忽略。)
2.CLR表头。包括元数据的主版本号和次版本号,一些标记,如果是GUI或CUI则会有入口点方法(Main方法)的MethodDef元数据标记,一个可选的强命名数据标签等。
3.元数据。一块二进制数据。包含一些表。分两种,一种描述源代码中定义的类型和成员(元数据定义表ModuleDef,TypeDef,FieldDef,MethodDef,ParamDef,PropertyDef,EventDef),一种描述源代码中引用的类型和成员(元数据引用表AssemblyRef,ModuleRef,TypeRef,MemberRef)。
4.IL代码(又叫托管代码)。编译器在编译源代码时产生的指令。
所有面向CLR的编译器都需要为托管模块生成完整的元数据。元数据是一些早先的技术如类型库,接口定义语言(IDL)文件的一个超集。但远比他们完整。不像类型库和IDL,元数据总是和包含IL代码的文件相关联。实际上,两者总是嵌入同一个EXE/DLL中。因为编译器总是同时产生元数据和IL代码,并把它们同时嵌入托管模块中。
元数据的好处:
1.省去源代码编译时对头文件和库文件的需求。
2.帮助实现智能感知(IntelliSense)。
3.在CLR的代码验证过程中确保仅执行“安全”的操作。
4.进行序列化和反序列化。
5.帮助GC跟踪对象的生存期。
C++编译器允许同时编写托管和非托管代码,并且生成到同一个模块中。
/////////////////////////////////////////////////////////////
CLR不与托管模块打交道,它直接打交道的对象是程序集(Assembly)。程序集是一个抽象概念。可以是一个或多个文件。
1.程序集是一个或多个托管模块以及一些资源文件的逻辑组合。
2.程序集是组件复用,实施安全策略和版本策略的最小单位。
多个托管模块和资源文件用程序集链接器AL.exe组合到一个程序集中并产生一个PE文件来表示所有文件的逻辑组合。该PE文件包含清单(manifest)的数据块。
清单中包括:
AssemblyDef,名称,程序集的版本,语言文化,发布者公钥等;
ExportedTypesDef,公有导出类型;
FileDef,除清单所在文件外,程序集包含的其他的PE文件和资源文件;
ManifestResourceDef,每一个资源的名称,标记,资源所在的资源文件等。
AssemblyRef,一个程序集中所有文件引用的其他程序集都在该表中有一个对应的条目。
CLR总是先加载包含清单元数据表的文件,然后用清单来获取程序集中其他文件。清单为程序集的使用者和其各个部分之间提供了一层间接关联,也使得程序集实现自描述。
包含清单的程序集有以下特性:
1.程序集定义了可重用的类型。
2.程序集标识有一个版本号。
3.程序集可以包含与之相关的安全信息。
程序集允许我们分离它的逻辑表示和物理表示(比如代码和资源分开)。 三种情况:
1.类型分别实现在不同的文件中,允许在网络环境下增量下载。
2.按需向程序集添加资源或数据文件。
3.可以使我们创建的程序集包含一些不同语言实现的类型。
////////////////////////////////////////////////////////////////////
我们可以直接以汇编语言的方式编写IL程序,IL汇编器ILAsm.exe。还有反汇编器ILDasm.exe
IL最大好处不是对底层CPU的抽象,而是大大的提高了应用程序的健壮性。当IL代码被编译成本地CPU指令时,CLR将执行一个叫“验证”的过程。验证过程可检查的情景:不能从未初始化的内存中读取数据;每个方法调用都必须传入正确的参数个数,并且各个参数的类型要正确匹配;每个方法的返回值都必须被正确的使用;每个方法都必须有一个返回值等等。