只有ReflectionOnlyLoadFrom才可以拯救与GAC冲突的强命名程序集
2017-08-15 09:15 杨新华 阅读(613) 评论(0) 编辑 收藏 举报先说结论,如果有两个拥有相同程序集名称的强命名程序集,一个在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