有以下几种选择:
直接获取可执行文件路径
Environment.ProcessPath
尽管文档中提到,该值可能返回空,但是在 Windows 桌面应用程序开发时,这几乎是不可能的,也许在其他的平台上会出现为空的情况?
Process.GetCurrentProcess().MainModule.FileName
非常低效,在文档中提示使用 System.Environment.ProcessPath 替代。
AppContext.BaseDirectory
似乎很不错,Playwright 正在使用这一方法。
AppDomain.CurrentDomain.BaseDirectory
与 AppContext.BaseDirectory 是等效的,并且在新版 .NET Core 中,不再支持多个应用程序域,因此没有必要再使用了。
Environment.CurrentDirectory
提供的是应用程序被执行的位置,不一定是应用程序可执行文件本身所在的目录。
IO.Directory.GetCurrentDirectory()
同上。
直接获取应用程序目录
AppContext.BaseDirectory
似乎很不错,Playwright 正在使用这一方法。
AppDomain.CurrentDomain.BaseDirectory
与 AppContext.BaseDirectory 是等效的,并且在新版 .NET Core 中,不再支持多个应用程序域,因此没有必要再使用了。
Environment.CurrentDirectory
提供的是应用程序被执行的位置,不一定是应用程序可执行文件本身所在的目录。
IO.Directory.GetCurrentDirectory()
同上。
通过 Assembly 获取程序目录
var assembly = typeof(Xxx).Assembly
//var assembly = Reflection.Assembly.GetExecutingAssembly()先获取一个 Assembly 再说。
//Uri codeBase;
//Uri.TryCreate(assembly.CodeBase, UriKind.Absolute, out codeBase)
//new FileInfo(codeBase.LocalPath).Directory;以上代码中,CodeBase 已不再受支持,文档提示使用 assembly.Location 替代。
IO.Path.GetDirectoryName(assembly.Location) // 有用?
new FileInfo(assembly.Location).Directory;// 不知道和上一行有什么区别性能相比前面的更差,且获得的可能是 DLL 文件而不是 EXE 文件的路径或文件名,并且 ,在调试模式下表现可能和发布后单独运行不一致(有可能为空)。
Find the location of my application's executable in WPF (C# or vb.net)?