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. 线程池c3p0和dbcp2的配置初始化实例

    一.c3p0 public class ConnectionManager { public static ComboPooledDataSource dataSource; static { try ...

  2. Ribbon 和 wowza 的集成开发

            前言        Ribbon 是提供 REST 服务的区域感知负载均衡器,它在 wowza 的前端,应该部署在专业的 REST 容器下,而不是流媒体服务器 wowza 下. 本文介 ...

  3. 安装配置PhoneGap开发环境(二)——使用Cordova取代PhoneGap创建项目

    1 Cordova是谁 PhoneGap的官方文档说的非常清楚.Cordova是PhoneGap的引擎,这两者的关系类似于WebKit与Chrome浏览器的关系.所以一些核心的基础操作对于Cordov ...

  4. Q_PROPERTY介绍

    QT提供了一个成熟的属性系统,但是作为一个跨平台的且与编译器无关的库,qt不依赖于非标准的编译器功能例如 __property or [property]: QT的强大之处在于它可以支持任何标准的c+ ...

  5. linux kill 关闭进程命令

    杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释:标准的kill命令通常都能达到目的 ...

  6. Atitit.spring体系结构大总结

    Atitit.spring体系结构大总结 1. Srping mvc 1 2. Ioc 4 3. ApplicationContext在BeanFactory的基础上构建,区别 4 4. Aop 5 ...

  7. [svc]linux测速软件speedtest-cli

    linux测速软件: https://github.com/sivel/speedtest-cli 以下是我在gentoo上测的

  8. OpenCV3+Python3

    OpenCV3计算机视觉Python语言实现笔记 图像处理与OpenCV Python3与OpenCV3.3 图像处理 OpenCV文摘 基于Python3 + OpenCV3.3.1的远程监控程序 ...

  9. 成为 Team Leader 后我最关心的那些事

    成为 Team Leader 后我最关心的那些事   推荐序 老有人问我 iOS 开发如何提高,今天收到一个来自网易的朋友投稿,分享他在成为 iOS 项目负责人之后面临的问题.文章中分享的如何招人,如 ...

  10. 本地vagrant配置虚拟域名的坑

    修改 /usr/local/php56/etc/php.d/Zend.ini   文件 将developer.zl的路径加上去 修改nginx 的vhost里面的xx.com.conf 和上一级目录的 ...