先说结论,如果有两个拥有相同程序集名称的强命名程序集,一个在GAC里,一个不在。怎样动态加载那个不在GAC里的程序集?答案就是只有Assembly.ReflectionOnlyLoadFrom才可以加载这个程序集,
比如我们把system.dll文件拷贝到D盘(注意应用程序域默认会加载mscorlib.dll,而不是system.dll)。然后试试用下面的方法:
var path = @"D:\system.dll";//Load(byte[])Assembly.Load(File.ReadAllBytes(path));//LoadFrom(string)Assembly.LoadFrom(path);//LoadFile(string)Assembly.LoadFile(path); foreach (var ass in AppDomain.CurrentDomain.GetAssemblies()) { Console.WriteLine(ass.Location); }
输出中将会有.NET Framework GAC中的system.dll,而不是我们在D盘的system.dll
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\.Net版本\System.dll
好吧,只有ReflectionOnlyLoadFrom才可以最后使用这个文件。
var path = @"D:\system.dll"; //ReflectionOnlyLoadFrom(string) Assembly.ReflectionOnlyLoadFrom(path); //注意用AppDomain.ReflectionOnlyGetAssemblies()
foreach (var ass in AppDomain.CurrentDomain.GetAssemblies()) { Console.WriteLine(ass.Location); }
输出:
D:\system.dll