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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值