netnr 2019-01-22

IHostingEnvironment 对象有两个常用的属性值: ContentRootPathWebRootPath,表示根目录和 根目录 +wwwroot

以上是常规的理解方式,而实际上,还需要注意:

ContentRootPath 属性是会变化的,嗯?

ContentRootPath 属性得到的值为当前启动命令的目录

有图有真相

1628552182

1630334e4b

在不同目录下启动程序,如果程序里面用到 ContentRootPathWebRootPath 属性定位文件,就会出现 路径错误 的问题

https://github.com/dotnet/aspnetcore/issues/6890


路径的对比分析 2025-09-20

从下面的分析 ContentRootPath 类似 Environment.CurrentDirectory 根据环境变化

另外在 Visual Studio 开发环境,Console 和 Web 项目 Environment.CurrentDirectory 不一样

类型 路径
Console Microsoft.NET.Sdk D:\site\Netnr.DataX\bin\Debug\net7.0
Web Microsoft.NET.Sdk.Web D:\site\Netnr.DataKit

对比

名称 说明
AppContext.BaseDirectory 程序集目录,只读,如 C:\MyApp\
Environment.ProcessPath 当前进程文件完整路径,只读,(.NET Core 3.0+),如 C:\MyApp\MyApp.exe
Environment.CurrentDirectory 当前工作目录,可读写 可变化,如 C:\MyApp\C:\Users\Administrator
Directory.GetCurrentDirectory() 内部调用 Environment.CurrentDirectory

测试

直接运行完整路径 C:\Users\Administrator> D:\test_path\Netnr.DataX.exe

应用程序位置
AppContext.BaseDirectory:  D:\test_path\
Environment.ProcessPath:  D:\test_path\Netnr.DataX.exe

命令行位置
Environment.CurrentDirectory:  C:\Users\Administrator
Directory.GetCurrentDirectory():  C:\Users\Administrator

修改 Environment.CurrentDirectory
Environment.CurrentDirectory:  D:\
Directory.GetCurrentDirectory():  D:\

进入到根目录运行 C:\Users\Administrator> cd D:\test_path && .\Netnr.DataX.exe
命令行位置,变成了 cd 的目录

Environment.CurrentDirectory:  D:\test_path
Directory.GetCurrentDirectory():  D:\test_path

通过 dotnet 运行 C:\Users\Administrator> dotnet D:\test_path\Netnr.DataX.dll
应用程序位置,程序名称指向 dotnet.exe

AppContext.BaseDirectory:  D:\test_path\
Environment.ProcessPath:  C:\Program Files\dotnet\dotnet.exe

实践

定位程序资源(配置、插件、数据文件等)

string configPath = Path.Combine(AppContext.BaseDirectory, "config.json");

获取程序自身路径(用于日志、更新等)

string exePath = Environment.ProcessPath;

用户操作相关路径(如保存文件)

string savePath = Path.Combine(Environment.CurrentDirectory, "output.txt");
登录写评论