通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

反射程序集 :Assembly

.Net中,程序集是进行部署、版本控制的基本单位,它包含了相关的模块和类型,同时也包含了描述这些类型的元数据。在System.Reflection命名空间下有一个Assembly类型,它代表了一个程序集,并包含了关于程序集的信息。

加载程序的方法主要有下面的几种方法:隐式加载、Assembly.Load 、Assembly.LoadFrom  、Assembly.LoadFile 、Assembly.LoadWithPartialName。

隐式加载:被引用的程序集,CLR会按照全局程序集缓存GAC)、工作目录(应用程序所在目录)以及私有路径目录的顺序来寻找并加载。

Assembly.Load:通过接受一个程序集标识来加载程序集.

 a)强命名程序集:该标识包括程序集名称、版本、语言文化、以及公有密钥标记,Load方法将导致CLR按照隐式加载的策略寻找并加载程序集。

 b)弱类型程序集:只是一个不带文件扩展名的程序集的名称,CLR不会到GAC中查找,如果没有指定私有目录,则在工作目录查找,如Assembly.Load("Math")。其中私有目录的定义可以在配置文件中指定。

Assembly.LoadFrom:当将一个程序集添加到项目引用中以后,可以直接写文件名.dll”。如果想加载一个不属于当前项目的程序集,则需要给出全路径。所以参数是包括程序集清单的文件的名称或路径,包括文件扩展名.

与load相比:加载一个在非工作目录下的程序集后,在另一个程序集中使用这个程序集中的对象进行反序列化时失败。使用Assembly.Load方法或者将该程序集放在工作目录下后问题得以解决。 

Assembly.LoadFile方法

用来加载指定路径上的程序集文件的内容。使用LoadFile方法来加载和检查具有相同标识但位于不同路径中的程序集。与LoadFrom不同,LoadFile不会将文件加载到LoadFrom上下文中,也不会使用加载路径解析依赖项。LoadFile在这个受限制的方案中很有用,因为 LoadFrom不能用于加载标识相同但路径不同的程序集;它只加载第一个这样的程序集。 

Assembly.LoadWithPartialName:

使用部分名称从应用程序目录或从全局程序集缓存加载程序集。参数为程序集标识,其中包含程序集的名称(不带文件扩展名)。程序集的版本、语言文化及公用密钥标记为可选。

该方法执行时,CLR首先检查应用程序的XML配置文件来搜索qualifyAssembly元素,若存在则该元素应能告诉CLR如何将一个部分的程序集标识映射为完全限定的标识,CRL将根据通常规则来查找程序集。

若该元素不存在,CRL将使用指定名称在应用程序的工作目录和私有路径目录中搜索。若仍未找到,则到GAC中查找。 


使用Assembly类型的静态方法 GetExecutingAssembly:获得当前程序集,它返回包含当前执行的代码的程序集(也就是当前程序集) 


 



posted on 2009-05-18 23:02  Roamman  阅读(740)  评论(1编辑  收藏  举报