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

如何从非工作目录执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:10:01