简单讲解C#反射之Assembly

C#反射之Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom方法介绍
   
    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结。
    

    对于反射的总结,我想从以下几个方面展开,首先是反射程序集,模块,类的成员以及成员的一些信息;接下来就是动态调用类的成员方法;第三个方面就动态产生程序集,模块和类以及类的成员。好了,现在就让我们从反射各种信息开始吧
   
    在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:
   
    System.Reflection命名空间
   
    (1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
   
    (2)   Assembly:程序集类
   
    (3)   Module:模块类
   
    (4)   Type:使用反射得到类型信息的最核心的类
   
    他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.
   
    AppDomain这个类我们等下再来讲解。我们先关注Assembly个类
   
    在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load、LoadFrom和LoadWithPartialName三个Assembly的静态方法。
   
    先来讲解Assembly.Load方法,该方法会有多个重载版本,其中一个就是提供程序集的详细信息,即程序集的标识,包括程序集的名称,版本,区域信息,公有密钥标记,全部都是以一个字符串的形式提供,例如:"MyAssembly,Version=1.0.0.0,culture=zh-CN,PublicKeyToken=47887f89771bc57f".
   
    那么,使用Assembly.Load加载程序集的顺序是怎样的呢?首先它会去全局程序集缓存查找,然后到应用程序的根目录查找,最后会到应用程序的私有路径查找。
   
    当然,如果你使用的是弱命名程序集,也即只给出程序集的名称,那么这个时候,CLR将不会在程序集上应用任何安全或者部署策略,而且Load也不会到全局缓存程序集中查找程序集。
   
    测试加载弱命名程序集的例子如下:
   
    (1)   新建一个控制台应用程序的工程,同时勾选创建解决方案
   
    (2)   在解决方案中新建一个类库的项目,随便写一个类和一个方法
   
    (3)   在控制台项目中,首先不添加引用,直接在Main方法中添加如下代码:
   
    Assembly assembly = Assembly.Load("MyAssembly");
   
    if (assembly != null)
   
    { Console.WriteLine("加载成功"); }
   
    执行程序,会抛出异常,说找不到该程序集。什么原因呢?因为我们使用的是弱命名程序集,Load方法不会去全局程序集缓存中查找,而该应用程序目录下又没有该程序集,所以程序找不到。这个时候,我们把程序稍微改一下,不用添加代码,只需添加对MyAssembly的引用,重新运行程序,加载成功了。更多内容http://www.cnblogs.com/relaibma/

你可能感兴趣的:(方法,文章,程序,动态,的)