为了使用程序目录更加整洁和美观,我们会建立不同文件夹,分门另类地管理软件目录下的程序集和配置文件,要想使主程序能够读取它们,必须要设置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); }标签:C#,AppDomain,System,几种,BindingFlags,CurrentDomain,path,AssemblyResolve,PrivatePa From: https://www.cnblogs.com/liweis/p/17035963.html