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);
}
posted @ 2023-01-09 08:33  我也是个傻瓜  阅读(2159)  评论(0)    收藏  举报