CLS/CLR、c#(等语言)、托管、元数据、程序集 CLR学习第二课 狼

一、名称解释:

CLS:common language specilication:通用语言规范;

CLR:common language Runtime 公共语言运行时。

托管代码:编译的代码直接clr等一层一层的进行 代码编译(C#--C#编译器--CLR(把它编译为IL)--IL--本地cpu可执行代码)并进行类型安全验证、资源释放等操作。

非托管代码:c#语言生成的代码直接由cpu执行,所以需要自己处理资源释放、类型安全检查、等一系列的操作。

元数据:包含程序运行所需的一切资源信息,元数据中包含3个表:定义表(Def)、引用表(Ref)、清单表。

其中定义表、引用表:中分别包含了 模块(ModuleRef、MouduleDef)、类型(type)、方法(Method)、字段(Filed)、参数(Param)、属性、事件的引用表和定义表(都是在他们后面加Def或者ref)。

清单表:一组元数据的集合,包含程序集中一部分文件名称、还描述了程序集的版本、语言、发布者、共有打出类型、以及程序所需的所有文件;

清单元数据:AssemblyDef、FileDef、MainfestResourceDef(包含程序集的所以资源条目,和一个该资源在资源文件或者流在FileDef表中的索引,如果该资源不是单独文件则把它嵌入到PE文件中)、ExportTypesDef(程序集中所有的PE模块导出的每一个共有类型都在其中;还包括了类型名称,一个FileDef表中的引用,和一个TypeDef表的索引,清单PE文件中的类型不会在该表中)。清单为程序使用者和其各个部分直接提供了一个层接关系,实现程序集自描述。程序集清单知道该清单所包含的文件是一个程序集的,但是其他程序集却不知道他们是一个程序集。

codeBase:在配置文件中定义;保存应用程序需要下载的程序集文件,其中包含得有需要下载程序集的url。当程序加载一个程序集时,CLR首先获得codebase元素的地址,然后在本地机器下缓存中看是否存在该文件,如果存在则加载,不存在抛出FileNotFoundException异常。

程序集(exe、dll):定义了可重用的类型、版本号、安全相关的信息。

二、vs支持很多语言,所有的语言经过自己的编译器处理,clr处理,最后生成IL代码。也就是说所有的语言建立在同一个基础上的,所有可以实现不同语言生成的dll、或者exe文件之间公用,也方便了代码的反编译。但是公用exe或者dll文件的标准是他们必须遵循CLS规则。如vb中不区分大小写、c#中区分、c++中不支持无符号类型等。所有在写能让其他语言调用的代码时必须遵循cls规则,统一原则。才可以相互调用,可以给代码设置属性,让其检查当前语言编写规范是否符合cls规则(方法在类上方声明属性:assembly:[CLSCompliant(true))] 编译器就会自动检查上方cls兼容。

原文地址:https://www.cnblogs.com/gowhy/p/2001949.html