Aseembly中Load, LoadFrom, LoadFile以及AppDomain中相应函数的区别
时间:2011-05-04 来源:_Mgen
Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的。
这些函数大致可以分为四类:
第一类:加载到Load Context内
属于这一类的函数有
Assembly和AppDomain类:Load(Assembly) Load(string) 函数
这是所有动态加载程序集时最好要使用的Context。
进行一个小测试
1 string assName = "mbody"; //这是程序集名称,不是路径
2 string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll"); //这是路径
3
4 var load = Assembly.Load(assName); //用程序及名称加载
5 var load2 = Assembly.Load(new AssemblyName() { CodeBase = pLocal }); //用路径
6 Console.WriteLine(load == load2); //True
.
第二类:加载到LoadFrom Context内
属于这一类的函数有
Assembly类:LoadFrom函数
AppDomain类:CreateInstanceFrom, ExecuteAssembly函数
这里不可以指定程序集版本或其他信息,并且如果在LoadFrom Context内已经有一个具有相同程序集名称(即使程序集路径不一样),仍然会返回那个已经加载的程序集。
LoadFrom Context主要用在当一个程序集不再AppDomain信息中的ApplicationBase目录以及附带的PrivateBinPath目录内(关于这两个目录:可以参考我的另一篇文章:http://www.cnblogs.com/mgen/archive/2011/05/02/2034371.html)
小测试
1 //这几个文件都是同一个程序集
2 string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");
3
4 var load = Assembly.Load("mbody");
5 var loadFromloc = Assembly.LoadFrom(pLocal);
6 var loadFrom = Assembly.LoadFrom("c:\\mbody.dll");
7 var loadFrom2 = Assembly.LoadFrom("C:\\mbody2.dll");
8
9 Console.WriteLine(load == loadFromloc);
10 Console.WriteLine(loadFrom == loadFrom2);
11 Console.WriteLine(load == loadFrom);
12 //(load == loadFromLoc) != (loadFrom == loadFrom2)
.
第三类:反射Context
属于这一类的函数有:
Assembly类:ReflectionOnlyLoad, ReflectionOnlyLoadFrom函数
这里加载的程序集不能执行,类的静态构造函数也不执行,一般用来进行反射操作。
.
第四类:不属于任何Context
属于这一类的函数有:
Assembly类:LoadFile, Load(byte[])
测试
1 //这几个文件都是同一个程序集
2 string pLocal = Path.Combine(Environment.CurrentDirectory, "mbody.dll");
3
4 var load = Assembly.Load("mbody");
5 var loadFileloc = Assembly.LoadFrom(pLocal);
6 var loadFile = Assembly.LoadFile("c:\\mbody.dll");
7 var loadFile2 = Assembly.LoadFile("C:\\mbody2.dll");
8
9 doo(load, loadFileloc, loadFile, loadFile2);
10 Console.WriteLine(load == loadFileloc);
11 Console.WriteLine(loadFile == loadFile2);
12 Console.WriteLine(load == loadFile);
13 //(load == loadFromLoc) != (loadFrom != loadFrom2)
.