如何从非工作目录执行dotnet .dll并正常加载appsettings.json
从外部目录执行dotnet dll加载不到appsettings.json的解决方法
出现这个问题的根本原因是:.NET默认加载appsettings.json时,会以执行dotnet命令时的当前工作目录为查找基准,而不是dll文件自身所在的目录,所以你在C:\root下执行命令时,程序默认会去C:\root下找配置,自然读不到build目录里的文件。
你提到的两种实现思路都有对应的落地方式,具体如下:
方案1:代码层面适配(最稳定,不依赖执行环境,对应option B思路)
这是最推荐的方案,改一次代码之后不管从哪个路径启动程序,都能正确加载配置,不需要额外加启动参数或者切目录。
核心逻辑是不要用Directory.GetCurrentDirectory()获取路径(这个拿到的是执行命令时的shell目录,不是dll所在目录),而是用AppContext.BaseDirectory,这个属性固定返回程序集dll自身所在的文件夹路径。
基础适配:自动加载dll同目录的appsettings.json
.NET 6及以上版本用顶级语句写Program.cs的话,直接给构建器指定ContentRootPath就行:
var builder = WebApplication.CreateBuilder(new WebApplicationOptions { // 把内容根目录固定为dll所在目录,默认配置加载就会从这里找appsettings ContentRootPath = AppContext.BaseDirectory, Args = args }); // 后续写正常业务代码即可,比如builder.Services.Addxxx... var app = builder.Build(); // ...中间的中间件配置 app.Run();
扩展支持--appsettings参数指定配置路径
如果你想实现手动传参指定配置文件的效果,只需要加几行代码解析命令行参数,手动追加配置源就行:
// 先从命令行参数里找--appsettings指定的路径 var settingsArg = args.FirstOrDefault(arg => arg.StartsWith("--appsettings ", StringComparison.OrdinalIgnoreCase)); if (settingsArg != null) { var customSettingsPath = settingsArg.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries)[1]; // 追加自定义的配置文件,参数设为文件不存在就报错、文件修改自动重载 builder.Configuration.AddJsonFile(customSettingsPath, optional: false, reloadOnChange: true); }
编译之后就可以直接用你设想的命令启动:
dotnet c:\root\build\hello.dll --appsettings c:\root\build\appsettings.json
方案2:不改代码,通过执行逻辑适配(对应option A思路)
如果你不想重新编译程序,可以直接在执行时调整工作目录或者指定.NET识别的环境变量:
方式1:临时切换到dll目录执行
不需要手动cd切目录,可以直接写单行命令,执行完自动切回原目录:
- PowerShell环境:
Push-Location "C:\root\build"; dotnet .\hello.dll; Pop-Location
- Cmd环境:
cd /d C:\root\build && dotnet hello.dll
方式2:通过环境变量指定内容根目录
你设想的自定义工作目录环境变量名有拼写错误,而且.NET没有内置DOTNET_WORKING_DIRECOTRY这个变量,对应的原生识别变量是DOTNET_CONTENTROOT,设置之后程序会自动把这个路径作为内容根目录查找配置:
# PowerShell下设置环境变量 $env:DOTNET_CONTENTROOT = "C:\root\build" dotnet C:\root\build\hello.dll
如果是ASP.NET Core程序,也可以用ASPNETCORE_CONTENTROOT变量,效果一致。
踩坑提示:所有需要读取程序自身附带文件(比如配置、静态资源、随dll发布的数据文件)的场景,都不要用
Directory.GetCurrentDirectory()拼路径,优先用AppContext.BaseDirectory,否则只要启动目录变了就会出现文件找不到的问题。
内容的提问来源于stack exchange,提问作者Florian Boehmak
相关产品推荐
相关产品推荐

