C#读书笔记(框架设计第二版:CLR VIA C#)—— 一些生成、打包、部署和管理应用程序的核心概念

                                第一部分:一些生成、打包、部署和管理应用程序的核心概念

实现了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)。如下所示:

 

 1// COM+ 2.0 header structure.
 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

posted @ 2008-03-05 14:09  寒蝉  阅读(1068)  评论(0编辑  收藏  举报