Assembly中Load, LoadFrom, LoadFile以及AppDomain, Activator类中相应函数的区别
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类中相应函数的区别的更多相关文章
- php中strstr、strrchr、substr、stristr四个函数的区别总结
php中strstr.strrchr.substr.stristr四个函数的区别总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-09-22我要评论 这篇文章主要介绍了php ...
- php中strstr、strrchr、substr、stristr四个函数用法区别
php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...
- PHP接口中的静态变量、常量与类中静态变量、常量的区别
接口: 1 不能够定义静态变量(常量除外) 2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用 3 不 ...
- 切记切记:Spring配置文件中,Component-scan无法扫描到的类中的自动装配对象无法被调用,报空指针错误。
Spring单例注入,单例对象可设置成Spring元件. 只有Spring的元件中@Autowired才有用,在普通类中@Autowired虽然不会编译报错,但运行时会报空指针错误.
- 将source类中的属性值赋给target类中对应的属性
/** * 对象的属性值拷贝 * <p> * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样 * <p> * example: * <p ...
- mybatis中的mapper接口文件以及selectByExample类的实例函数详解
记录分为两个部分,第一部分主要关注selectByExample类的实例函数的实现:第二部分讨论Mybatis框架下基本的实例函数. (一)selectByExample类的实例函数的实现 当你启动项 ...
- 在java中如何在非servlet的普通类中获取request、response、session
原文:http://blog.csdn.net/u012255097/article/details/53092628 在spring的普通类中: HttpServletRequest request ...
- mybatis中的mapper接口文件以及example类的实例函数以及详解
##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列 ...
- java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍
在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...
随机推荐
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- Mycat和MySQL的差别——Mycat的核心作用
有个朋友面试的时候被问到:Mycat和MySQL的差别.我们能够把上层看作是对下层的抽象,比如操作系统是对各类计算机硬件的抽象.那么我们什么时候须要抽象?假如仅仅有一种硬件的时候,我们须要开发一个操作 ...
- web项目的路径问题
一.使用base标签,使相对路径和绝对路径可以同时使用 但是,base标签对Ie低版本不兼容(IE8及IE8以下) 不过,鉴于IE在国内具有无与伦比的统治地位,所以,换了个写法: <script ...
- 字符串函数---itoa()函数具体解释及实现
itoa()函数 itoa():char *itoa( int value, char *string,int radix); 原型说明: value:欲转换的数据. string:目标字符串的地址. ...
- Qt 2D绘图高级篇
1.拖动模式 在QGraphicView中提供了三种拖动模式,分别是: QGraphicsView::NoDrag :忽略鼠标事件,不可以拖动. QGraphicsView::ScrollHandDr ...
- 让gcc和gdb支持intel格式的汇编
Linux下的gdb和gcc默认输出的汇编都是AT&T格式的,但是它们都有方式来转换为Intel格式. -masm=[intel|att] 选择intel或AT&T的汇编语法 gcc ...
- Windows 2003 IIS 不支持ASP问题的解决方法
有时候我们在配置iis的时候,为了安全关闭了asp的支持,下面我们来介绍下让iis支持asp的一些注意事项特别注意:当我们在没有配置好iis的时候,不要安装补丁了,组件之类的东西,先把网站弄开通了,再 ...
- Atitit.web预览播放视频的总结
Atitit.web预览播放视频的总结 1. 浏览器类型的兼容性(chrome,ff,ie) 1 2. 操作系统的兼容性 1 3. 视频格式的内部视频格式跟播放器插件的兼容性.. 2 4. 指定播放器 ...
- Windows下ADB默认的5037port被占用,解决方式。
Windows下可能会因为系统版本号不一样的原因导致有的系统5037port被系统进程占用.导致ADB无法使用5037port,从而导致ADB不能打开.在eclipse上跑Android程序的时候显示 ...
- json对象与json字符串互转方法
jQuery插件支持的转换方式: 复制代码 代码如下: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转换成json对象 ...