第一部分:一些生成、打包、部署和管理应用程序的核心概念
实现了System.Console方法在MSCorLib.dll中;
MSCorLib.dll包含所有核心的类型:Byte,Char,String,Int32等。由于该程序集使用频繁,C#编译器会自动引用该程序集。
应答文件:应答文件是一个文本文件,其中包含一系列的编译器命令行开关;
托管PE文件:PE32(+)头、CLR头、元数据以及中间语言的那些模块所特有的。
CLR 头:为一个信息块,包含用于生成模块的CLR的主,副版本号;一些标志(flag);一个MEthodDef标记,他指定了模块的入口方
法;以及一个可选的强名称数字签名;最后含有模块内部的特定元数据表的大小和偏移量。具体格式可以参考 CorHdr.h文件的
IMAGE_COR20_HEADER定义(在..\Microsoft Visual Studio 8\SDK\v2.0\include)。如下所示:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

元数据:元数据是一个二进制数据块,它由几个表构成,他们可以分为三个类别:定义表(definition table ),引用表(references
table)以及清单表(manifest table).
常见定义表有:ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef,EventDef.
常见的引用表:
AssemblyRef,ModuleRef,TypeRef,MemberRef.
清单元数据表:
AssemblyDef,FileDef,ManifestResourceDef,ExportedTypesDef.
查看元数据的工具:ILDasm.exe(Intermediate Language Disassembler)
程序集:是一个或者多个类型定义文件及资源文件的集合。清单是一系列元数据表的集合,他们主要包含作为程序集一部分的那些文
件的名称。此外,他们还描述了程序集的版本、语言文化、发布者、公共导入的类型以及构成程序集的所有文件。
CLR操作的是程序集。即它总是先加载包含“清单”的元数据表文件,然后使用该文件来获取其他程序集中的其他文件的名称。
正是由于清单的存在,程序集的用户才可以不必关心程序的划分细节,使程序集具有了自我描述性(self-describing).
版本号:如2.5.719.2。2.5表示公众对一个版本号的理解,表示为2.5版本的程序集。第三个编号(719)代表程序集的生成编号,最后
一个编号(2)表示修订号。
CLR支持两种程序集:强命名程序集(strongly named assembly)和弱程序集(weakly named assembly).二者真正的区别在于:强命名
程序集使用发布者的公钥/私钥对来进行签名,它唯一的标识了程序集的发布者。程序集支持两种部署,私有部署和公有部署。弱程
序集只支持私有部署,强命名程序集即支持私有也支持共有。
全局程序集缓存(Global Assembly Cache ,GAC):位于..\windows\Assembly。工具为:GACCUtil.exe,使用它可以用来卸载或者加载
程序集.它的作用是保持强命名程序集与一个子目录的联系,CLR有一个内部函数,可以获取程序集的名称、版本号、语言文化和公钥
标记。然后这个函数返回一个子目录的路径,其中包含指定程序集的文件。GAC允许多应用程序共享程序集而不出错,防止Dll Hell