Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的。 这些函数大致可以分为四类:

第一类:加载到Load Context内

Load Context:

  • Load Context是所有动态加载程序集首选应该被加载到的地方。
  • 它只能加载在AppDomain信息中的ApplicationBase目录以及附带的PrivateBinPath目录内的程序集(关于这两个目录:可以参考另一篇文章:http://www.cnblogs.com/mgen/archive/2011/05/02/2034371.html

执行这个操作的方法是:

Assembly.Load(AssemblyName)

Assembly.Load(string  程序集名称)

注意上面的字符串参数是程序集名称,而不是路径,程序集名称可以直接是简写的程序集名称,或是完整的名称比如(SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3)(不带括号)

间接调用上面方法的其他方法有:

AppDomain类

Load(AssemblyName)

Load(string 程序集名称)

ExecuteAssemblyByName(string 程序集名称)

CreateInstance(...)

Activator类

CreateInstance(...)

进行一个小测试

string assName = "mbody";

//这是程序集名称,不是路径

string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");

//这是路径

var load = Assembly.Load(assName);

//用程序集名称加载

var load2 = Assembly.Load(new AssemblyName() { CodeBase = pLocal });

//用路径

Console.WriteLine(load == load2); //True

第二类:加载到LoadFrom Context内

LoadFrom Context

  • 主要用来加载不在ApplicationBase目录以及附带的PrivateBinPath目录内的程序集
  • 不可以指定程序集版本或其他信息
  • 如果在LoadFrom Context中已经有一个具有相同程序集名称的程序集(即使实际程序集路径不一样),LoadFrom仍然会返回已经加载的程序集

执行这个操作的方法是:

Assembly.LoadFrom(string 程序集文件路径, ...)

这里的字符串参数是文件路径。

间接调用上面方法的其他方法有:

AppDomain类

CreateInstanceFrom(string 程序集文件路径, ...)

Activator类

CreateInstanceFrom(string 程序集文件路径, ...)

小测试

//这几个文件都是同一个程序集

string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");

var load = Assembly.Load("mbody");

var loadFromloc = Assembly.LoadFrom(pLocal);

var loadFrom = Assembly.LoadFrom("c:\\mbody.dll");

var loadFrom2 = Assembly.LoadFrom("C:\\mbody2.dll");

Console.WriteLine(load == loadFromloc);

Console.WriteLine(loadFrom == loadFrom2);

Console.WriteLine(load == loadFrom);

//(load == loadFromLoc) != (loadFrom == loadFrom2)

第三类:反射Context

反射Context

  • 这里加载的程序集不能执行,类的静态构造函数也不执行,一般用来进行反射操作。

属于这一类的方法有:

Assembly.ReflectionOnlyLoad(string  程序集名称)  (byte[])

Assembly.ReflectionOnlyLoadFrom(string 程序集文件路径)

第四类:不属于任何Context

不属于任何Context

  • 用来加载LoadFrom无法加载的具有相同程序集名称但是路径不同的程序集
  • 可以是通过字节数组加载,也可能是Reflection.Emit生成的不在磁盘的程序集
  • 具有很多的限制

属于这一类的方法有:

Assembly.Load(byte[])

Assembly.LoadFile(string 程序集文件路径)

AppDomain.ExecuteAssembly(string 程序集文件路径, ...)

测试 :

//这几个文件都是同一个程序集

string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");

var load = Assembly.Load("mbody");

var loadFileloc = Assembly.LoadFrom(pLocal);

var loadFile = Assembly.LoadFile("c:\\mbody.dll");

var loadFile2 = Assembly.LoadFile("C:\\mbody2.dll");

Console.WriteLine(load == loadFileloc);

Console.WriteLine(loadFile == loadFile2);

Console.WriteLine(load == loadFile);

//(load == loadFromLoc) != (loadFrom != loadFrom2)

更多可以参考MSDN(见备注):http://msdn.microsoft.com/zh-cn/library/1009fa28.aspx

Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别的更多相关文章

  1. php中strstr、strrchr、substr、stristr四个函数的区别总结

    php中strstr.strrchr.substr.stristr四个函数的区别总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-09-22我要评论 这篇文章主要介绍了php ...

  2. php中strstr、strrchr、substr、stristr四个函数用法区别

    php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...

  3. PHP接口中的静态变量、常量与类中静态变量、常量的区别

    接口: 1 不能够定义静态变量(常量除外) 2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用 3 不 ...

  4. 切记切记:Spring配置文件中,Component-scan无法扫描到的类中的自动装配对象无法被调用,报空指针错误。

    Spring单例注入,单例对象可设置成Spring元件. 只有Spring的元件中@Autowired才有用,在普通类中@Autowired虽然不会编译报错,但运行时会报空指针错误.

  5. 将source类中的属性值赋给target类中对应的属性

    /** * 对象的属性值拷贝 * <p> * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样 * <p> * example: * <p ...

  6. mybatis中的mapper接口文件以及selectByExample类的实例函数详解

    记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...

  7. 在java中如何在非servlet的普通类中获取request、response、session

    原文:http://blog.csdn.net/u012255097/article/details/53092628 在spring的普通类中: HttpServletRequest request ...

  8. mybatis中的mapper接口文件以及example类的实例函数以及详解

    ##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列 ...

  9. java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍

    在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...

随机推荐

  1. EAST 自然场景文本检测

           自然场景文本检测是图像处理的核心模块,也是一直想要接触的一个方面. 刚好看到国内的旷视今年在CVPR2017的一篇文章:EAST: An Efficient and Accurate S ...

  2. AutoFac文档3(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 服务类型,名称和键 同 ...

  3. vue 发送ajax请求

    一. 简介 1.vue本身不支持发送AJAX请求,需要使用vue-resource(vue1.0版本).axios(vue2.0版本)等插件实现 2.axios是一个基于Promise的HTTP请求客 ...

  4. atitit。获取表格的字段注释metadata的原理以及AND 字段表格描述文档方案

    atitit.获取表格的字段注释metadata的原理以及AND 字段表格描述文档方案 1. 通过sql ide navicate获取(推荐)通过meatadata数据库获取 1 2. 通过代码获取 ...

  5. [c#]分析器错误消息: 发现不明白的匹配。

    (1)同样的变量名称 protected System.Web.UI.WebControls.Label lbltitle; protected System.Web.UI.WebControls.L ...

  6. POJ - 3264 Balanced Lineup (RMQ问题求区间最值)

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

  7. 1、Reactive Extensions for .NET(译)

    注:本文的工程是基于 vs2010 的,在 vs2012 中区别不大. 本文的意图是让读者熟悉 Reactive Extension for .net(Rx) 的使用.通过一系列的例子,让读者感受 基 ...

  8. 01、Windows Phone 套接字(Socket)实战之交互设计

    这个 Demo 主要使用 WP 中提供的 Socket 对象,来与 PC 端进行文字.文件的互相传输.因为在 WP 中系统 对存储的操作限制的比较多,例如,你把 .doc..txt..zip 等常见的 ...

  9. linux超级终端minicom的使用方法

    ===== 一.Minicom介绍 =====       Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件   设备.适于在linux通过超级终端对 ...

  10. redis使用场景介绍

    一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了 ...