先說結論,如果有兩個擁有相同程式集名稱的強命名程式集,一個在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\v4.0_4.0.0.0__b77a5c561934e089\System.dll
好吧,只有ReflectionOnlyLoadFrom才可以最後使用這個檔案。
代碼:
var path = @"D:\system.dll";
//ReflectionOnlyLoadFrom(string)
Assembly.ReflectionOnlyLoadFrom(path);
//注意用AppDomain.ReflectionOnlyGetAssemblies()
foreach (var ass in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies())
Console.WriteLine(ass.Location);
輸出:
D:\system.dll