.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
相关产品推荐
相关产品推荐

