dotnet 启动进程传入不存在的文件夹作为工作目录行为变更
本文记录在 dotnet 下,启动进程,传入不存在的文件夹作为进程的工作目录,分别在 .NET Framework 和 .NET Core 的行为
在 dotnet 6 下,可以使用 ProcessStartInfo 辅助创建 Process 进程,如以下代码进行测试,传入不存在的 Z:\Windows
文件夹
Console.WriteLine($"Fx {Environment.CurrentDirectory}");
if (args.Length > 0)
{
return;
}
var location = Assembly.GetExecutingAssembly().Location;
var fileName = Path.GetFileNameWithoutExtension(location);
var directory = Path.GetDirectoryName(location);
var exe = Path.Combine(directory, fileName + ".exe");
var processStartInfo = new ProcessStartInfo(exe,"fx")
{
WorkingDirectory = "Z:\\Windows"
};
var process = Process.Start(processStartInfo);
运行将会在 Process.Start 方法上抛出 System.ComponentModel.Win32Exception 说 目录名称无效
如果是在英文环境下,将会提示 The directory name is invalid
从而失败
但如果没有设置 ProcessStartInfo 的 WorkingDirectory 工作路径,那么默认将使用当前进程的 Environment.CurrentDirectory 值作为启动进程的工作路径
在 .NET Core 和 .NET Framework 下,启动时,设置 UseShellExecute 分别为 true 和 false 的值,行为有所不同。在不设置 ProcessStartInfo 的 WorkingDirectory 工作路径,让新的进程默认使用 Environment.CurrentDirectory 工作文件夹。但是此工作路径是一个被插拔的 U 盘的路径,如以下代码
Environment.CurrentDirectory = @"I:\";
var exe = Path.Combine(directory, fileName + ".exe"); // 执行到这句代码的时候,拔出 U 盘,让 I:\ 不存在
var processStartInfo = new ProcessStartInfo(exe, "fx")
{
UseShellExecute = true, // 也设置为 false 的值
};
var process = Process.Start(processStartInfo);
process.WaitForExit();
我使用 .NET 6 和 .NET Framework 4.5 进行分别的测试,测试如下:
在 .NET Core 下,设置 UseShellExecute=false 的值,运行结果是:成功,新进程工作路径等于 I:\
路径
在 .NET Core 下,设置 UseShellExecute=true 的值,运行结果是:成功,新进程工作路径等于 C:\Windows
路径
在 .NET Framework 下,设置 UseShellExecute=false 的值,运行结果是:运行 Process.Start 失败,提示 System.ComponentModel.Win32Exception: '目录名称无效。'
错误
在 .NET Framework 下,设置 UseShellExecute=true 的值,运行结果是:成功,新进程工作路径等于 C:\Windows
路径
更多请看 c# - Win32Exception: The directory name is invalid - Stack Overflow
CreateProcess and ShellExecute differences - Stack Overflow
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin f7696a3e9f33dfcbfdd8ab92afaa77ab668dfeb9
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
获取代码之后,进入 HebarlawkuKekebuwagay 文件夹
相关文章
- [Rootkit] 傀儡进程
- 第二十一章 控制进程(二)
- pidstat - 监控并统计Linux进程的数据
- Linux下进程信息/proc/pid/status的深入分析
- kibana启动--nohup在关闭终端后无效&&守护进程详解
- HBase启动后发现HMaster进程消失了
- MFC学习之创建进程、获取进程相关信息、获取启动参数
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- 物理内存,虚拟内存,进程地址空间
- windows Service启动带有管理员权限的GUI进程
- Linux命令:Linux创建文件4种方式、ps命令显示进程状态、let命令执行一个或多个表达式
- Android系统启动流程(二)解析Zygote进程启动过程
- java父子进程通信
- Linux内核分析:实验八--Linux进程调度与切换
- 【Linux】不重启进程的情况下动态修改进程limits限制
- ps 显示当前进程的状态
- centos 7 查看磁盘io ,找出占用io读写很高的进程
- Linux - 如何启动进程
- zabbix 进程监控和配置钉钉告警、自定义Key
- 虚拟机启动报错:另一个程序已锁定文件的一部分,进程无法访问