天天看點

Assembly resolve(自定義加載指定目錄的程式集)

 預設情況下項目引用的dll都需要放在跟主程式相同的目錄下,當項目引用的dll越來越多,則會顯得淩亂。

這時可以通過AssemblyResolve來處理這件事情。

AppDomain.CurrentDomain.AssemblyResolve += OnCurrentDomainAssemblyResolve;
           
private Assembly OnCurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)
           
if(string.IsNullOrWhiteSpace(args.Name))
           
return null;
           
}
           
string[] assemblyNameSplits = args.Name.Split(',');
           
if(assemblyNameSplits.Length == 0)
           
return null;
           
}
           
string name = asemblyNameSplits[0];
           
if(asemblyNameSplits.Length==3)
           
string name2= asemblyNameSplits[2];
           
if(name.EndsWith(".resources") && name2.EndsWith("neutral"))
           
return null;
           
}
           
else
           
return LoadAssembly(name);
           
}
           
}
           
return LoadAssembly(name);
           
}
           
private Assembly LoadAssembly(string name)
           
if(assemblyLoadedDic.ContainsKey(name))
           
return assemblyLoadedDic[name];
           
}
           
else
           
if(assemblyPathsDic.ContainsKey(name))
           
string path = assemblyPathsDic[name].AssemblyPath;
           
Assembly loadedAssembly = Assembly.LoadFile(path);
           
assemblyLoadedDic[name] = loadedAssembly;
           
return loadedAssembly;
           
}
           
}
           
return null;
           
}
           

根據一個目錄,讀取目錄及子目錄下所有dll

private Dictonary<string,AssemblyItem> GetAssemblyPaths(string folderPath)
{
           
string folder = folderPath;
if(!Path.IsPathRooted(folderPath))
           
folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,folder);
           
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
           
</pre><pre name="code" class="csharp">if(!Directory.Exists(forder))
           
return null;
           
}
           
</pre><pre name="code" class="csharp">var result = new Dictonary<string,AssemblyItem>();
           
</pre><pre name="code" class="csharp">string dllfiles = Direcotry.GetFiles(folder,"*.dll",SearchOption.AllDirecotries);
           
foreach(var dllfile in dllfiles)
           
string assemblyname = Path.GetFileName(dllfile);
           
assemblyname = assemblyname.Substring(0,assemblyname.Length - 4);
           
string assemblyPath = Path.GetFullPath(dllfile);
           
</pre><pre name="code" class="csharp">var assemblyItem = new AssemblyItem()
           
AssemblyName = assemblyname,
           
AssemblyPaht = assemblyPath,
           
};
           
</pre><pre name="code" class="csharp">result[assemblyname] = assemblyItem;
           
</pre><pre name="code" class="csharp">}
           
</pre><pre name="code" class="csharp">return resutl;
           
</pre><pre name="code" class="csharp">}
           

繼續閱讀