默认情况下项目引用的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">}