.NET 获取 EXE 所在目录的方法
2024-09-04 15:40:23

获取 EXE 所在目录可以先获取 EXE 完整路径,再提取出目录。不过本文不讲,因为有内置方法可以直接获取目录。
.NET 中有5种方式获取 EXE 目录,先看看例子:

1
2
3
4
5
Debug.WriteLine("Directory.GetCurrentDirectory(): " + Directory.GetCurrentDirectory());
Debug.WriteLine("Environment.CurrentDirectory: " + Environment.CurrentDirectory);
Debug.WriteLine("AppDomain.CurrentDomain.BaseDirectory:" + AppDomain.CurrentDomain.BaseDirectory);
Debug.WriteLine("AppDomain.CurrentDomain.SetupInformation.ApplicationBase: " + AppDomain.CurrentDomain.SetupInformation.ApplicationBase);
Debug.WriteLine("Application.StartupPath: " + Application.StartupPath);

双击方式启动 EXE,得到以下输出:

1
2
3
4
5
Directory.GetCurrentDirectory(): C:\dir
Environment.CurrentDirectory: C:\dir
AppDomain.CurrentDomain.BaseDirectory:C:\dir\
AppDomain.CurrentDomain.SetupInformation.ApplicationBase:C:\dir\
Application.StartupPath: C:\dir

再将起始位置切换到其他目录,用 CMD 方式启动:

1
2
cd C:
C:\dir\demo.exe

这样启动,工作目录就是C:\,得到以下输出:

1
2
3
4
5
Directory.GetCurrentDirectory(): C:\ 
Environment.CurrentDirectory: C:\
AppDomain.CurrentDomain.BaseDirectory: c:\dir\
AppDomain.CurrentDomain.SetupInformation.ApplicationBase: c:\dir\
Application.StartupPath: c:\dir

Directory.GetCurrentDirectoryEnvironment.CurrentDirectory 返回的是工作目录,不符合预期。
Application.StartupPath 是 WinForms 程序特定属性,不是最优选择。
AppDomainSetup.ApplicationBase 属性可修改,不可靠。
最后就只剩下 AppDomain.CurrentDomain.BaseDirectory 了,是一个只读属性,不依赖 WinForms,推荐使用。