天天看点

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">}
           

继续阅读