Assembly resolve(自定义加载指定目录的程序集)

本文介绍如何利用AssemblyResolve事件处理程序,避免将大量DLL放置在主程序目录下造成混乱。通过指定目录加载dll文件,实现程序集的自定义加载。

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr蹇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值