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. MFC显示GIF动画图片

    本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程.  附件  GifPicture.rar (138.1 ...

  2. dango models and database ---- verbose name

    一.django 自带ORM: 1.在django中用models.Mode来描述一张数据库中的表.而列用models.*Field来描述列 from django.db import models ...

  3. 详解登录认证及授权--Shiro系列(一)

    Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密.Apache Shiro 的首要目标是易于使用和理解.安全有时候是很复杂的,甚至是痛苦的, ...

  4. 18. Subsets II【medium】

    Given a list of numbers that may has duplicate numbers, return all possible subsets Notice Each elem ...

  5. layui关闭layer.open打开的页面

    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引parent.layer.close(index);

  6. dropload.js下拉加载更多

    项目中有用到下拉加载更多的地方,去网上找了一个插件,地址:http://ons.me/526.html总体还是不错的,可能自己不是特别了解这个插件,做项目时,也是遇到了无数问题.项目中要用的是两个ta ...

  7. httpclient4.5 的一些细节

    本文转自:http://mercymessi.iteye.com/blog/2250161 httpclient是Apache下的一个用于执行http网络访问的一个工具包. 大致流程:新建一个http ...

  8. android版本号始终为1

    之前用Eclipse里时,版本号是检查是做如下 <manifest xmlns:android="http://schemas.android.com/apk/res/android& ...

  9. beaglebone black ubuntu display x11 server的配置

     Change default resolution on BeagleBone modesetting vs fbdev digiteltlc May 7th, 2014, 03:28 PM Hi ...

  10. Android——Activity初学

    manifests里的AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> < ...