代码改变世界

只有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