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. MySQL慢查询查找和调优测试

    MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下.本文参考自:http://www.jbxue.com/db/4376.html  编辑 my.cnf或者my.ini文件,去除 ...

  2. [svc]influxdb最佳实战-监控对比

    最近在搞容器的监控,遇到influxdb这个库,搞了两天,些许明白了些套路,做个记录,备忘.... 小结如下: influxdb go语言编写 默认情况influxdb创建的库关联autogen的RP ...

  3. MySql导入导出数据库(含远程导入导出)

    一.导入导出本地数据库    导出: 1.先运行cmd,cd 到mysql安装目录中的bin文件夹 2.mysqldump -u root -p 数据库名 > 导出文件名.sql 其他情况下: ...

  4. spring boot热部署pom.xml配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. mysql 使用 temp

    whereis 软件 检查数据库mysqlcheck -uroot -p --all-databases 修复$ mysql -uroot -p databasename REPAIR TABLE t ...

  6. spring 注解@Resource @Autowired区别

    1.@Autowired寻找类的时候默认是ByType,也就是通过类的类型来寻找类.不过,也可以通过借助@Qualifier("name")来指定寻找的类名 @Autowired ...

  7. 示例 - C#脚本代码采集搜狐NBA球员, 球队和比赛实况

    最近 @甜瓜 (QQ:1069629945) 开发了一套NBA数据采集脚本, 我觉得很赞. 经他允许发布出来和大家分享一些经验: 球员球队: http://data.sports.sohu.com/n ...

  8. 记一次redis攻击

    服务器挖矿病毒的排查过程 事情起因:朋友的一台阿里云主机,登录特别卡,找我看看 这一看就感觉出问题了,机器特别卡,top看了一眼,cpu几乎是100%运行 但是奇怪的是用top命令完全看不出来哪个进程 ...

  9. 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?

    早期,我们使用 Debian 作为服务器软件,后来转向了CentOS,主要原因如下: 1.CentOS/RHEL的生命周期是7年,基本上可以覆盖硬件的生命周期,也就意味着一个新硬件安装以后,不用再次安 ...

  10. selenium中WebElement.getText()为空解决方法

    当使用getText()获取一个普通的链接文本时: <a href="http://www.baidu.com">baidu</a> 如果得到的文本只为空, ...