如何决定是不是将 ProcessStartInfo.UseShellExecute 属性设置为 true 或 false?
Posted
技术标签:
【中文标题】如何决定是不是将 ProcessStartInfo.UseShellExecute 属性设置为 true 或 false?【英文标题】:How to decide whether or not to set ProcessStartInfo.UseShellExecute Property to true or false?如何决定是否将 ProcessStartInfo.UseShellExecute 属性设置为 true 或 false? 【发布时间】:2019-11-21 03:06:35 【问题描述】:我正在从我的 C# windows 窗体应用程序调用/启动 .exe 应用程序和 .bat 批处理文件(我也在传递参数)。如何确定是否需要将 ProcessStartInfo.UseShellExecute 属性设置为 true 或 false?什么情况下真比假好,反之亦然?
我正在使用 ProcessStartInfo 类来设置所有进程信息。然后,我使用 System.Diagnostics.Process.Start(ProcessStartInfo) 方法根据我的 ProcessStartInfo 启动进程。
using System.Diagnostics;
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = "[something]";
processInfo.Arguments = "[parameter1] [parameter2] [parameter3]";
Process.Start(processInfo);
我希望这些流程能够启动并正常运行。如果我需要添加更多信息/澄清某些事情,请告诉我,这是我的第一个问题。
【问题讨论】:
文档中有说明:ProcessStartInfo.UseShellExecute Property @Castorix 我还是不明白,有什么区别?为什么我应该选择使用 shellexecute 而不是不使用它 我添加了一个包含更多细节的答案... 【参考方案1】:你可以在.NET源码中看到:
UseShellExecute = true =>内部函数StartWithShellExecuteEx => 调用ShellExecuteEx
UseShellExecute = 假 =>内部函数StartWithCreateProcess => 调用CreateProcessWithLogonW 或CreateProcessW
当您想要启动与扩展关联的可执行文件时,通常使用 true。 喜欢:
using (Process p = new Process())
string sImage = @"e:\test.jpg";
p.StartInfo.FileName = sImage;
p.StartInfo.Verb = "open";
p.StartInfo.UseShellExecute = true;
p.Start();
如果我设置为 false,它将失败,因为它会尝试使用 "e:\test.jpg" 作为命令行调用 CreateProcessW
【讨论】:
谢谢,这对理解文档更有帮助以上是关于如何决定是不是将 ProcessStartInfo.UseShellExecute 属性设置为 true 或 false?的主要内容,如果未能解决你的问题,请参考以下文章
将 ProcessStartInfo.WorkingDirectory 设置为 UNC 路径
ProcessStartInfo 挂在“WaitForExit”上?为啥?
ProcessStartInfo - 在控制台窗口和文件中打印输出(C#)
请问.net的processstartinfo.arguments传多参数怎么处理?
使用 CREATE_SUSPENDED 标志和 JobObject 从 CreateProcessAsUser 为 C# 进程设置 ProcessStartInfo