AppDomain.CurrentDomain.BaseDirectory 是最可靠方式获取程序运行目录,返回带末尾反斜杠的完整路径;它不受工作目录变更影响,比 Environment.CurrentDirectory 和 Assembly.Location 更稳定,推荐新项目优先用 AppContext.BaseDirectory。
获取当前程序的运行目录(不是安装目录)
在 C# 中,
是最可靠的方式获取程序实际运行时所在的目录(即启动时工作目录下的可执行文件所在路径),它不受
变更影响,也不依赖于安装位置。
适用于控制台、Windows Forms、WPF 等所有 .NET 应用
返回的是带末尾反斜杠的完整路径,例如:
和
不同:后者返回当前 DLL 的路径,可能不是主程序目录(比如从插件调用时)
与
(仅 WinForms)相比,
更通用且跨平台兼容(.NET Core/.NET 5+ 同样有效)
为什么不用
?
返回的是当前工作目录,它可能被代码、第三方库甚至用户手动修改过(比如调用了
),不能代表程序本身的位置。
常见错误:在调试时它恰好等于运行目录,上线后因服务启动方式不同(如 Windows 服务默认工作目录是
)导致读取配置失败
即使没主动改,某些 IDE(如 VS)或宿主环境(如 IIS Express)也会设置不同的初始工作目录
它不反映程序集物理位置,只反映“当前命令行上下文”
和
有什么区别?
.NET Core 3.0+ 引入了
,它和
在大多数场景下行为一致,但语义更清晰 —— 明确表示“当前应用上下文的基目录”,且在单文件发布(single-file publish)模式下也能正确返回提取后的临时目录(而非打包前的路径)。
推荐新项目优先用
,尤其使用 .NET 5/6+ 或启用单文件部署时
旧项目维持
即可,两者在非单文件场景下结果相同
注意:
在 .NET Framework 中不可用,需条件编译或运行时判断
实际使用示例
下面这段代码安全地获取运行目录,并拼接一个相对配置文件路径:
C知道
CSDN推出的一款AI技术问答工具
下载
如果需要去掉末尾反斜杠,用
并不推荐 —— 因为
保证结尾有斜杠,直接拼接
更安全;手动截断反而容易出错。
真正容易被忽略的是:当程序以“单文件”方式发布时,
指向的是解压后的临时目录,不是原始发布目录。如果你把资源文件硬编码进发布包但没随单文件一起打包,运行时就会找不到 —— 这类问题往往只在生产环境暴露。
AppDomain.CurrentDomain.BaseDirectoryEnvironment.CurrentDirectory"C:\MyApp\"Assembly.GetExecutingAssembly().LocationApplication.StartupPathBaseDirectoryEnvironment.CurrentDirectoryEnvironment.CurrentDirectoryDirectory.SetCurrentDirectory(...)C:\Windows\System32AppContext.BaseDirectoryBaseDirectoryAppContext.BaseDirectoryAppDomain.CurrentDomain.BaseDirectoryAppContext.BaseDirectoryAppDomain.CurrentDomain.BaseDirectoryAppContext.BaseDirectorystring appDir = AppContext.BaseDirectory;
// 或兼容旧框架:string appDir = AppDomain.CurrentDomain.BaseDirectory;
string configPath = Path.Combine(appDir, "appsettings.json");
if (File.Exists(configPath))
{
// 加载配置
}
Path.GetDirectoryName(appDir)BaseDirectoryPath.CombineBaseDirectory