You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 C# WindowsForms使用probing加载子目录dll失效如何解决

.NET 6实现自定义程序集探测路径的解决方案

.NET Core及以上版本(包括.NET 5/6/7/8)已废弃原.NET Framework中app.config的<probing>配置逻辑,要实现相同的指定私有路径探测程序集的功能,可选择以下两种方案:

方案1:通过runtimeconfig配置(无需修改代码,推荐)

.NET 6程序启动时会读取[程序集名].runtimeconfig.json文件中的配置,我们可以通过配置additionalProbingPaths属性指定自定义探测路径:

  • 在项目根目录新建runtimeconfig.template.json文件,填入以下内容:
{
  "runtimeOptions": {
    "additionalProbingPaths": [
      "languages",
      "bin"
    ]
  }
}
  • 重新编译项目,编译后生成的runtimeconfig.json会自动包含上述配置,程序启动时就会自动从指定的languages、bin目录下探测加载所需程序集。如果是已发布的程序,也可以直接修改发布目录下的xxx.runtimeconfig.json文件,在runtimeOptions节点下追加上述additionalProbingPaths配置即可生效。

以上配置的路径均为相对路径,默认相对于程序运行的根目录(AppContext.BaseDirectory),也可以根据需求填写绝对路径。

方案2:代码中手动处理程序集加载

如果需要更灵活的控制逻辑,可以在程序启动入口处注册程序集解析事件,手动从指定路径加载程序集:

using System.Reflection;
using System.Runtime.Loader;

// 放在程序启动入口处执行,例如WPF的App.xaml.cs构造函数、WinForms的Program.Main方法开头
AssemblyLoadContext.Default.Resolving += (context, name) =>
{
    // 定义自定义探测目录
    string[] probePaths = ["languages", "bin"];
    foreach (var path in probePaths)
    {
        var dllPath = Path.Combine(AppContext.BaseDirectory, path, $"{name.Name}.dll");
        if (File.Exists(dllPath))
        {
            return context.LoadFromAssemblyPath(dllPath);
        }
    }
    return null;
};

内容的提问来源于stack exchange,提问作者Gorodeckij Dimitrij

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:36:07