第一部分:一些生成、打包、部署和管理应用程序的核心概念
实现了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)。如下所示:
2typedef struct IMAGE_COR20_HEADER
3{
4 // Header versioning
5 DWORD cb;
6 WORD MajorRuntimeVersion;
7 WORD MinorRuntimeVersion;
8
9 // Symbol table and startup information
10 IMAGE_DATA_DIRECTORY MetaData;
11 DWORD Flags;
12// DDBLD - Added next section to replace following lin
13// DDBLD - Still verifying, since not in NT SDK
14// DWORD EntryPointToken;
15
16 // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is not set, EntryPointToken represents a managed entrypoint.
17 // If COMIMAGE_FLAGS_NATIVE_ENTRYPOINT is set, EntryPointRVA represents an RVA to a native entrypoint.
18 union {
19 DWORD EntryPointToken;
20 DWORD EntryPointRVA;
21 };
22// DDBLD - End of Added Area
23
24 // Binding information
25 IMAGE_DATA_DIRECTORY Resources;
26 IMAGE_DATA_DIRECTORY StrongNameSignature;
27
28 // Regular fixup and binding information
29 IMAGE_DATA_DIRECTORY CodeManagerTable;
30 IMAGE_DATA_DIRECTORY VTableFixups;
31 IMAGE_DATA_DIRECTORY ExportAddressTableJumps;
32
33 // Precompiled image info (internal use only - set to zero)
34 IMAGE_DATA_DIRECTORY ManagedNativeHeader;
35
36} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
元数据:元数据是一个二进制数据块,它由几个表构成,他们可以分为三个类别:定义表(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