它直接打交道的对象是程序集 实际上不和托管模块打交道,它直接打交道的对象是程序集.程序集由一个或多个托 管模块及相关的资源文件逻辑组成.其次,程序集是组件复用,以及实施安全策略和版本策
略的最小单位.程序集中有一个托管模块中包含清单(manifest)的数据块,而清单仅仅 程序集中有一个托管模块中包含清单( 程序集中有一个托管模块中包含清单 )的数据块, 也是一些元数据表的集合,但是这些表描述了组成程序集所有文件中的公有导出类型, 也是一些元数据表的集合,但是这些表描述了组成程序集所有文件中的公有导出类型,以 及一些和程序集相关的资源文件或数据文件. 及一些和程序集相关的资源文件或数据文件.如果程序集只有一个托管模块且没有资源文 件,该程序集就是托管模块.
由于 CLR 不直接和托管模块打交道,所以默认情况下,编译器会将产生的托管模块转换为 一个程序集.只有这样程序才能够运行.
2.1,托管模块 ,
托管模块有下列部分组成:
PE3 2或 PE32+表 表 标准 PE 头: 文件头,类 似于 Common Object File Format 头. 如果头使 用 PE32 格 式,文件可 以运行在 32 位或 64 位的
Windows 当中.如果 头使用 PE32+格 式,文件必 须运行在 64 位 Windows 当中.该头 还指名了 文件
的类 型:GUI, CUI 或 DLL,同时 还包含了 一个用来 指明文件 何时创建 的时间戳. 对于只包 含 IL 代码 的模块, PE32(+)中 的大量信 息都会被
忽略.对于 包含本地 CPU 代码 的模块,头 还包括本 地 CPU 代 码的信息.
CL R 表头 表头:包 含标识托 管模块的 一些信息 (可以被 CLR 或一 些工具解 析).包括 托管模块 所需要的 CLR 版本 号,一些标 记,托管模 块入口点 方法 (main 方法)的 MethodDe
f 元数据标 记,以及有 关托管模 块的元数 据 (metadat a),资源 (resource s),强命 名(strong name), 标记 (flags), 和其他一 些意义不 大的信息 的位置和 大小.
元数 据:每个托 管模块都 包含一些 元数据表. 元数据表 主要分两
种:一种用 来描述代 码中定义 的类型和 成员.一种 用来描述 代码中引 用的类型 和成员.
IL 代码:编译 代码 器在编译
源代码时 产生的代 码.在运行 时, CLR 将 IL 编译为 本地 CPU 指令.
2.2,
程序集 ,
程序集是 CLR 操作的对象.程序集由一个或多个托管模块及相关的资源文件逻辑组成.在 程序集包含的所有文件中,有一个文件用于保存清单,清单是另外一组元数据表的集合,其 中主要包含了程序集中的一部分文件的名称, 另外清单文件还描述了程序集的版本, 语言文
化,发布者,公有导出类型,以及组成该程序集的所有文件.CLR 总是先加载包含清单元 数据表的文件,然后利用该清单来获取程序集中的其它文件. 数据表的文件 使用程序集的原因有:
程序 集允许我 们分离可 重用类型 的逻辑表 示和物理 表示.
可以 将类型分 别实现在 不同的文 件中,从而 允许在互 联网环境 中进行增 量下载.
可以 按需向程 序集中添 加资源或 数据文件.
可以 使我们创 建的程序 集包含一 些用不同 编程语言 实现的类 型.
总而言之,程序集是一个可重用,可实施版本策略和安全策略的单元. 总而言之,程序集是一个可重用,可实施版本策略和安全策略的单元.它允许我们将类型 和资源划分到不同的文件中,这样程序集的使用者便可以决定将哪些文件打包一起部署. 和资源划分到不同的文件中,这样程序集的使用者便可以决定将哪些文件打包一起部署. 加载了程序集中包含清单的那个文件, 一旦 CLR 加载了程序集中包含清单的那个文件, 它就可以确定程序集中的其他文件中哪些 包含了程序正在引用的类型和资源.任何程序集的使用者仅需要知道包含了清单的文件名. 包含了程序正在引用的类型和资源.任何程序集的使用者仅需要知道包含了清单的文件名. 用的类型和资源 要生成一个程序集,我们必须选择一个托管模块作为清单的保存者. 要生成一个程序集,我们必须选择一个
托管模块作为清单的保存者.
PS:以上仅为个人愚见,定有不当之处,欢迎指正!当中
设计的很多概念也没有深入,以 及很多概念也没有引出,如元数据没有深入介绍,FCL 也没有一个系统的介绍,未介绍到 应用程序域等等.当然要完成这些需要大量篇幅,以后会逐步介绍.