通天大圣小说好看吗:应用程序配置和动态加载1----程序集

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 20:08:13

本章开始介绍应用程序的配置与动态加载,本章牵涉的知识点很多,有程序集(Assembly)的概念,反射(Reflection)以及特性(Attribute),最后是应用程序的配置问题。在第一章中已经介绍了程序集的基本概念,并且对程序集的作了一些粗略的介绍,那么下面就结合实际的代码或者例子来看一下程序集的真实的面目。在反射中会利用程序集的概念以及反射的原理实现程序集的加载,也就是动态加载程序集。因为在程序中能够动态加载程序集,所以在应用程序中可以根据配置文件而加载不同的程序集,进而也能让程序呈现出不同的表现形式。

11.1 程序集(Assembly)

程序集是任何 .NET Framework应用程序的基本构造块。也就是说一个应用程序可以包含多个程序集,也可以只包含一个程序集。如果一个应用程序只包含一个程序集,那么这个程序集就是应用程序本身。所以说程序集并不能简单的说就是应用程序。它在概念上只是一个基本构造块,这个构造块可以大到是一个应用程序。小到可以只是为应用程序提供一个字符串的资源文件。例如,在生成简单的C#应用程序时,Visual Studio 创建一个单个可移植可执行 (PE) 文件即一个 EXE 或 DLL形式,明确地说就是一个程序集。

程序集在概念上是一个逻辑单元,而不是物理单元,也就是说一个程序集在逻辑上是一个整体,可是在物理存储上可以是一个文件,也可以是很多文件。存储在单文件中的程序集称为单文件程序集,相对应的另一种情况就称为多文件程序集。程序集是完全自我描述性的。程序集本身的内容就能够完全说明自己的所有特点,而不需要其他的辅助文件。程序集中应该包含编译好的、面向.NET Framework的代码,还可能包含在代码中用到的一些资源,比如,图片,字符串等。为了实现自描述,程序集还应该包括描述了对应代码中定义的类型和方法的数据,称这些数据为类型元数据。程序集也包含描述程序集本身的元数据,这种程序集元数据包含在一个称为程序集清单的区域中,在程序集清单中的元数据描述了程序集的版本号,区域性等信息,而且还描述了组成程序集的文件的列表,包含文件的名称一个文件存放的位置。

程序集与命名空间的关系。命名空间在逻辑上为程序中的每个类型提供了一个划分。但是并没有规定这个具体的类型必须存储到那个程序集中。一个命名空间可能全部存放到一个程序集中,也有可能存放到几个不同的程序集中。那么一个程序集可以仅仅只存放一个命名空间的所有类型,也可以存放几个不同的命名空间的所有类型。所以命名空间与程序集并不存在一一对应的关系。有人做过这样的一个比喻:命名空间就好像规定了一个人属于那个族(汉族,回族等),但是没有规定这个人要住在什么地方,而程序集就是这个人的居住地。回族可以居住在北京,上海,但是他依然是回族人。反过来北京、上海等地也不仅仅住回族,也可能居住的有其他族的人。这个民族与居住地的比喻很形象的说明了命名空间与程序集的关系。

11.1.1 查看程序集

大多数程序集(比如使用Visual Studio.NET创建的那些)一般都是单文件程序集,也就是只有一个.exe或者.dll文件(目前.NET的程序集只有这两种格式)。在这种情况下,程序集清单(manifest)直接嵌入到单文件程序集中。但是,你也可以用“程序集生成工具”(Al.exe)来创建多文件程序集。也可以只创建一个只包含清单的程序集。

程序集的清单可以通过.NET Framework SDK中的一个工具ILDASM可以查看。在vs2008提供的命令窗口中输入ILDASM,可以启动ILDASM软件,如图11-1所示:

图11-1

单击文件菜单,打开程序集System.Data.dll(在目录C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,不同的计算机目录可能不同),如图11-2所示:

图11-2

在图11-2中不同的内容使用了不同的图形符号来显示,在ILDASM中,所有的图形符号的含义如图11-3所示:

图11-3

点击图11-2中的MANIFEST,可以看到图11-4的界面。

图11-4

在其中有.module extern kernel32.dll的信息,这个信息就是元数据,它说明该程序集引用了模块kernel32.dll,还有下面的语句

.assembly extern mscorlib

{

  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                        

  .hash = (4E 11 1E C1 95 1B 45 70 B5 AD 39 08 4C D6 91 25   //

           12 FF FE BE )

  .ver 2:0:0:0

}

这条语句说明该程序集引用了外部的程序集mscorlib.dll,这条语句还列出了程序集mscorlib.dll的版本等信息。

程序集中除了包含数据清单,还包含了一些被编译为MSIL语言的代码。现在来看一下其中的一些代码。如图11-5,找到System.Data.AcceptRejectRule.Cascade。

图11-5

双击Cascade,就会出现一个窗口,里面有下面的一行信息。

.field public static literal valuetype System.Data.AcceptRejectRule Cascade = int32(0x00000001)

.field首先告诉你这个是AcceptRejectRule的一个数据域,它的值是int32(0x00000001)就是1,另外这个值是公开的(public)、静态的(static)、值类型(valuetype)等信息。