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)模式下也能正确返回提取后的临时目录(而非打包前的路径)。
沙之丘企业网站程序是一个以asp.net(C#) 4.0 +access进行开发的企业网站源码。主要功能:1、产品、设备、新闻系统2、留言信息直接发邮件到相关部门3、所有链接都以一级目录显示更好的权重4、其他信息扩展,可以增加如:人事招聘,公司介绍,地图,联系我们等5、带有商品和设备的搜索功能6、模板动态化方便扩展模板7、简体繁体选择显示运行环境:windows 2003或者更高windows服务
- 推荐新项目优先用
AppContext.BaseDirectory,尤其使用 .NET 5/6+ 或启用单文件部署时 - 旧项目维持
AppDomain.CurrentDomain.BaseDirectory即可,两者在非单文件场景下结果相同 - 注意:
AppContext.BaseDirectory在 .NET Framework 中不可用,需条件编译或运行时判断
实际使用示例
下面这段代码安全地获取运行目录,并拼接一个相对配置文件路径:
string appDir = AppContext.BaseDirectory;
// 或兼容旧框架:string appDir = AppDomain.CurrentDomain.BaseDirectory;
string configPath = Path.Combine(appDir, "appsettings.json");
<p>if (File.Exists(configPath))
{
// 加载配置
}如果需要去掉末尾反斜杠,用 Path.GetDirectoryName(appDir) 并不推荐 —— 因为 BaseDirectory 保证结尾有斜杠,直接拼接 Path.Combine 更安全;手动截断反而容易出错。
真正容易被忽略的是:当程序以“单文件”方式发布时,BaseDirectory 指向的是解压后的临时目录,不是原始发布目录。如果你把资源文件硬编码进发布包但没随单文件一起打包,运行时就会找不到 —— 这类问题往往只在生产环境暴露。









