标签:
Assembly和AppDomain的一些关于动态加载程序集的函数有些令人头疼,但细细研究后还是可以将他们区分的。 这些函数大致可以分为四类:
Load Context:
执行这个操作的方法是:
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
执行这个操作的方法是:
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
属于这一类的方法有:
Assembly.ReflectionOnlyLoad(string 程序集名称) (byte[])
Assembly.ReflectionOnlyLoadFrom(string 程序集文件路径)
不属于任何Context
属于这一类的方法有:
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类中相应函数的区别
标签:
原文地址:http://www.cnblogs.com/aaa6818162/p/4343696.html