CLR via C# 第二章 (1)

2.1 .NET Framework部署目标

安装一个性的应用程序他可能莫名其妙的破坏了另一个已经安装好的应用程序:DLL hell。

2.2 将类型生成到模块中

C#编译器自动引用Msccorlib.dll程序集。

响应文件是一个文本文件,其中包含一组编译器命令行开关。执行csc.exe时,编译器会打开响应文件,并使用其中包含的所有开关,就像是这些开关直接在命令行上传给csc.exe。为了指示编译器使用一个响应文件,在命令行中,请在@符号之前指定响应文件的名称。

.rsp后缀  不必再每次编译项目时,都手动指定需要的命令行参数。C#编译器允许同时指定多个响应文件。除了在命令行上显示指定的文件,编译器还会自动查找两个名为csc.rsp的文件。运行csc.exe是,它会在当前目录查找一个本地csc.rsp文件--应该将项目特有的所有设置都放到这个文件中。编译器还会在csc.exe文件所在的目录查找一个全局csc.rsp文件。如果有一些设置想应用于自己的全部项目,就应该将这些设置放到这个文件中。编译器会汇总并使用所有这些响应文件中的设置。本地和全局响应文件中的某个设置放生冲突,将以本地文件的设置为准。类似的,命令行上显式指定的设置将覆盖本地响应文件中的设置。

全局csc.rsp文件引用了默认引用的常用程序集。

/referene 编译器引用程序集时,如不指定路径会按以下顺序搜索文件:1.工作目录 2.csc.exe所在目录 3.使用/lib编译器开关指定的任何目录 4.使用LIB环境变量指定的任何目录。

2.3 元数据概述

元数据是一个二进制数据块,有几个表组成。分为三类:定义表、引用表、清单表。

常用的定义表:

  • ModuleDef:总是包含一个用于标识模块的记录项,其中包含模块的文件名,扩展名(不含路径),以及一个模块版本ID。
  • TypeDef:模块中定义的每个类型都在这个定义表中有一个对应的记录项。每个记录项包括类型名、基类型、一些访问标志,以及一些索引(指向该类型在MethodDef表中拥有的方法,在FieldDef表中拥有的字段,在PropertyDef表中拥有的属性,以及在EventDef表中拥有的事件。)
  • MethodDef:模块中定义的每个方法都在这个定义表中有一个对应的记录项。每个记录项都包含方法的名称、一些标志(private、public、virtual、abstract、static、final等)、签名以及该方法的IL代码在模块中的偏移量。每个记录项还引用了ParamDef表中的一个记录项,后者包括与方法参数有关的更多信息。
  • FieldDef:模块中定义的每个字段都在这个定义表中有一个对应的记录项。每个记录项都包含标志(private,public等)、类型和名称。
  • ParamDef:模块中定义的每个参数都在这个定义表中有哥哥对应的记录项。每个记录项都包含标志(in,out,retval等)、类型和名称。
  • EventDef:模块中定义的每个事件都在这个定义表中有一个对应的记录项。每个记录项都包含标志和名称。

常用的引用定义表:

  • AssemblyRef:模块中引用的每个程序集在这个表中都有一个对应的记录项。每个记录项都包含绑定到程序集所需的信息:程序集的名称(不含路径和扩展名)、版本号、语言文化(culture)以及公钥标记(根据发布者的公钥生成的一个小的哈希值,它标识了所引用的程序集的发布者)。在每个记录项中,还包含一些标志(flag)和一个哈希值。这个哈希值本应作为所应用的程序集的二进制数据的一个校验和来使用。但是,目前这个CLR完全忽略这个哈希值,未来的CLR可能同样如此。
  • ModuleRef:目前模块引用的类型可能是又别的PE模块实现的,所有那些模块在这个表中都有一个对应的记录项。每个记录项都包含模块的文件名和扩展名(不含路径)。在当前的调用程序集中,可能是别的模块实现了你需要的类型,这个表的作用是建立同那些类型的绑定关系。
  • TypeRef:模块引用的每个类型子啊这个表中都有一个对应的记录项。每个记录项都包含类型的名称和一个引用(指向类型的位置)。如果类型是在同一个模块中实现的,引用指向的就是一个ModuleDef记录项。如果类型是在调用程序集内部的另一个模块中实现的,引用指向的就是一个ModuleRef记录项。如果类型是在一个不同的程序集中实现的,引用指向的就是一个AssemblyRef记录项。
  • MemberRef:模块引用的每个成员(字段和方法,以及属性方法和事件方法)都在这个表中有一个对应的记录项。每个记录项都包含成员的名称和签名,并指向对成员进行定义的那个类型的TypeRef记录项。

用ILDasm.exe查看元数据表。

posted @ 2011-03-20 23:59  dotNet_Fan  阅读(286)  评论(0编辑  收藏  举报