C#中Environment.CurrentDirectory属性的工作原理是什么?
Environment.CurrentDirectory 工作原理解答
核心定义
Environment.CurrentDirectory 是用于获取或设置当前进程关联的工作目录的属性,它的取值和程序可执行文件自身的存放路径没有必然绑定关系,默认继承自启动当前进程的父进程的工作目录,也可以在进程运行过程中被主动修改。
场景对应解释
- IDE直接运行场景
Visual Studio 等 IDE 启动调试程序时,默认会将待调试程序的工作目录设置为项目编译输出目录(也就是你案例中 exe 所在的bin\Debug文件夹),因此此时输出的就是该路径。你也可以在项目属性的「调试」选项卡中手动修改「工作目录」参数,自定义程序启动时的工作目录值。 - 控制台手动启动场景
cmd/Powershell 窗口本身就是独立进程,你在控制台中通过cd等命令切换到的路径就是控制台进程当前的工作目录。直接输入 exe 路径启动程序时,新启动的程序进程会继承父进程(当前控制台)的工作目录,因此输出的就是你执行启动命令时控制台所处的路径。 - 第三方程序调用启动场景
用Process.Start启动新进程时,默认会将新进程的工作目录继承为调用方进程的当前工作目录。你案例中 ConsoleApp2 运行时的工作目录是自身的bin\Debug文件夹,因此被调用的 ConsoleApp1 获取到的工作目录就是这个路径。如果需要指定被调用程序的工作目录,可以通过ProcessStartInfo显式设置:Process.Start(new ProcessStartInfo(@"C:\Users\Admin\source\repos\FeaturesTest\ConsoleApp1\bin\Debug\ConsoleApp1.exe") { WorkingDirectory = @"C:\自定义的工作目录路径" });
常见用法补充
如果你需要固定获取程序可执行文件自身的存放目录,不要依赖 Environment.CurrentDirectory,推荐使用以下不受工作目录影响的方案:
- .NET Core / .NET 5+ 通用方案:
AppContext.BaseDirectory - 全平台兼容方案:
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
内容的提问来源于stack exchange,提问作者EggEgg
相关产品推荐
相关产品推荐

