默认情况下项目引用的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">}
本文介绍如何利用AssemblyResolve事件处理程序,避免将大量DLL放置在主程序目录下造成混乱。通过指定目录加载dll文件,实现程序集的自定义加载。
275

被折叠的 条评论
为什么被折叠?



