IHostingEnvironment
对象有两个常用的属性值: ContentRootPath
和 WebRootPath
,表示根目录和 根目录 +wwwroot
以上是常规的理解方式,而实际上,还需要注意:
ContentRootPath
属性是会变化的,嗯?
ContentRootPath
属性得到的值为当前启动命令的目录
有图有真相
在不同目录下启动程序,如果程序里面用到 ContentRootPath
和 WebRootPath
属性定位文件,就会出现 路径错误
的问题
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");