C#设置程序集PrivatePath的几种方法
为了使用程序目录更加整洁和美观,我们会建立不同文件夹,分门另类地管理软件目录下的程序集和配置文件,要想使主程序能够读取它们,必须要设置PrivatePath路径,常用的方法包括:
方法一 config配置
在app.config中配置中,添加如下代码,操作简单,配置灵活。
<runtime>
<gcConcurrent enabled="true" />
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<publisherPolicy apply="yes" />
<probing privatePath="Lib;Bin" />
</assemblyBinding>
</runtime>
方法二 代码设置
有时,我们不想让这个配置暴露出来,防止用户随意改动,也可以写在Main构造函数中。
static Program()
{
//设置程序集引用路径
string privatePath = "Lib;zh-Hans;AutoBase";
AppDomain.CurrentDomain.SetData("PRIVATE_BINPATH", privatePath);
AppDomain.CurrentDomain.SetData("BINPATH_PROBE_ONLY", privatePath);
MethodInfo updateContextMethod = typeof(AppDomainSetup).GetMethod("UpdateContextProperty", BindingFlags.NonPublic | BindingFlags.Static);
MethodInfo getFusionContextMethod = typeof(AppDomain).GetMethod("GetFusionContext", BindingFlags.NonPublic | BindingFlags.Instance);
if (updateContextMethod != null && getFusionContextMethod != null)
{
updateContextMethod.Invoke(null, new[] { getFusionContextMethod.Invoke(AppDomain.CurrentDomain, null), "PRIVATE_BINPATH", privatePath });
}
}
方法三 Resolve事件
如果主程序未能读取加载到想要的程序集,将触发AppDomain的AssemblyResolve事件。
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
在这个事件里处理即可。
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Libs\");
path = System.IO.Path.Combine(path, args.Name.Split(',')[0]);
path = String.Format(@"{0}.dll", path);
return System.Reflection.Assembly.LoadFrom(path);
}
作者:我也是个傻瓜
出处:http://www.cnblogs.com/liweis/
签名:成熟是一种明亮而不刺眼的光辉。

浙公网安备 33010602011771号