zoukankan      html  css  js  c++  java
  • 动态加载程序集Assembly.Load

    C#中,我们要使用反射,主要有三个方面。第一,反射程序集,模块,类的成员以及成员的一些信息;接下来就是动态调用类的成员方法;第三个方面就动态产生程序集,模块和类以及类的成员。

    我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:

    System.Reflection命名空间

    AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器

    Assembly:程序集类

    Module:模块类

    Type:使用反射得到类型信息的最核心的类

    他们之间是一种从属关系,也就是说,一个AppDomain可以包含NAssembly,一个Assembly可以包含NModule,而一个Module可以包含NType.

    在程序中,如果我们要动态加载一个程序集怎么办呢?有几种方式可以使用,分别是Load,LoadFromLoadWithPartialName三个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的引用,重新运行程序,加载成功了。

          接下来,我们就要看看Load怎么加载强命名程序集了,这个步骤稍微有些复杂。还是刚才的项目,找到MyAssembly.dll程序集所在的目录,一般在bin"Debug目录下

    (1)生成密钥对文件

    sn –k MyAssemblyKey.keys

    你也可以自己随便起一个密钥对文件名

    (2)生成公钥文件

    sn –p MyAssemblyKey.keys MyAssemblyPublicKey.PublicKey

    注:查看公钥命令:sn tp MyAssemblyPublicKey.PublicKey

    (3)创建强命名程序集。

    很简单,只需要在声明命名空间的那句代码上加上如下特性:

    [assembly:AssemblyKeyFileAttribute(@”D:"Test"MyAssemblyKey.keys”)]

    (4)   编译项目

    (5)   将程序集添加到程序集全局缓存

    gacutil –i MyAssembly.dll

    这个时候,转到加载程序集的项目中,将Load方法中的参数改为”程序集名,Version=版本,culture=区域信息,PublicKeyToken=公钥“,然后再去掉对程序集的引用,我们会发现,程序运行成功。表明Load到全局缓存区查找到了该程序集。

           使用Load方法加载程序集,特别是强命名程序集,能在程序集上应用安全和部署策略,推荐使用该方法动态加载程序集,至于LoadFromLoadWithPartialName

  • 相关阅读:
    Vim作者创造新编程语言Zimbu
    Google Maps API编程资源大全
    好网收集的地址
    三种模拟自动登录和提交POST信息的实现方法
    解析VMware三种网络连接方式
    PostgreSQL 创建帐号,数据库,权限
    LINUX目录详解
    Linux流媒体服务器安装配置
    用RAMDISK来提高PostgreSQL访问速度
    PostgreSQL 集群复制方案之使用pgq和londiste工具包
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/1518006.html
Copyright © 2011-2022 走看看