跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

c# 如何获取程序运行目录

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

if (File.Exists(configPath)) { // 加载配置 }

如果需要去掉末尾反斜杠,用
Path.GetDirectoryName(appDir)
并不推荐 —— 因为
BaseDirectory
保证结尾有斜杠,直接拼接
Path.Combine
更安全;手动截断反而容易出错。 真正容易被忽略的是:当程序以“单文件”方式发布时,
BaseDirectory
指向的是解压后的临时目录,不是原始发布目录。如果你把资源文件硬编码进发布包但没随单文件一起打包,运行时就会找不到 —— 这类问题往往只在生产环境暴露。

相关文章