第二章:生成、打包、部署和管理应用程序及类型

元数据概述  

  在剖析元数据之前,先给出以下几行代码:

 public sealed class Program
    {
       public static void Main()
       {
           System.Console.WriteLine("Hi");
       }
    }

  应用程序定义了一个名为Program的类型和Main方法,Main方法中引用了另外一个名为System.Console的类型。而System.Console是Microsoft已经实现好的一个类型,

这个实现好的类型的各个方法的IL代码存储在MSCorLib.dll文件中。当我们使用C#编译器(cs.exe Program.cs)编译这段源代码时会生成Program.exe文件,这个文件是一个标准

的PE(可移植执行体)文件,意味着运行32位或64位Windows的一台计算机能加载这个文件,并通过它执行某些操作。

  Program.exe文件包含的内容有:PE32(+)头、CLR头、元数据以及IL。PE32(+)头是Windows要求的标准信息,CLR头是一个小的信息块,是那些需要CLR的模块(托管模

块)所特有的。在这个头中,包含模板在生成时所面向的CLR的主和次版本号;一些标志;一个MethodDef token,它指定了模块的入口方法(前提是该模块是一个CUI或GUI执行

体);以及一个可选的强名称数字签名(将在第三章讨论);最后CLR头还包含模块内部的特定元数据表的大小和便宜量。

  好了,大概的说完了Program.exe文件的重要组成部分后,开始回到这一小节的主题:元数据。元数据,是一个二进制数据块,由几个表构成。这些表分为三个类别:元数据定

义表、元数据引用表,元数据清单表。定义表后缀一般带有Def,引用表后缀一般带有Ref,清单元数据表就不好说(-_-)。我们可以通过IL反汇编器ILDASM可以查看上面

Program.exe中的元数据:

  除此之外,元数据定义表中还包括用于标识模块的记录项ModuleDef,标识方法的记录项MethodDef,还有FiledDef,ParamDef,PropertyDef,EventDef等,从英文的字面上

很容易理解所代表的意思。元数据引用表包括AssemblyRef,ModuleRef,MemberRef等。AssemblyRef:模块中的每个程序集在这个表中都有一个对应的记录项,每个记录项

都包含绑定到程序集的信息,比如程序集名称、版本号、语言文化、公钥标记(一个哈希值,根据发布者的公钥生成)和一些标志(flag)、哈希值等:

  元数据定义表和元数据引用表在上文中都涉及到了,唯一没有详细谈到的就是元数据清单表。清单是一组元数据表的集合,元数据又是几个不同类型表的集合。我们知道,CLR

操作的是程序集。换言之,CLR总是首先加载包含“清单”元数据表的文件,再根据这个“清单”来获取程序集中的其他文件的名称。在程序集的所有文件中,有一个文件容纳了一个“清

单”。根据“清单”的元数据表,编译器将托管模块转换成程序集。

程序集版本控制信息

  使用csc.exe编译器生成一个PE文件程序集时,会在PE文件中嵌入一个标准的Win32版本资源。可通过”属性“对话框中的”详细信息”选项卡查看。在生成程序集时,通常使用定

制attribute来设置版本资源字段,比如我们项目中中的AssemblyInfo.cs文件。

  有关打包、部署的内容不在详述,主要还是自己在部署项目的过程中,善于思考,发现并及时总结问题,真正做到理论与实践的结合。

posted @ 2012-12-09 21:30  Samguist  阅读(251)  评论(0编辑  收藏  举报