//
// Summary:
// Gets or sets a value indicating whether to use the operating system shell
// to start the process.
//
// Returns:
// true to use the shell when starting the process; otherwise, the process is
// created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }
如果我们生成一个新进程,我们什么时候需要将UseShellExecute设置为True?
答案 0 :(得分:173)
UseShellExecute
布尔属性与使用windows ShellExecute函数与CreateProcess函数有关 - 简短的答案是,如果UseShellExecute
为真,那么{ {1}}类将使用Process
函数,否则将使用ShellExecute
。
更长的答案是CreateProcess
函数用于打开指定的程序或文件 - 它大致相当于在运行对话框中键入要执行的命令并单击OK,这意味着它可以是曾经(例如):
ShellExecute
例如:
PATH
它非常易于使用,功能多样且功能强大但却存在一些缺点:
如果您对实际运行的内容做出假设,则可能会引入安全漏洞:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
是一种更精确的启动流程的方式 - 它不会搜索路径并允许您重定向子流程的标准输入或输出(以及其他内容)。然而CreateProcess
的缺点是我上面给出的4个例子都不起作用(试试看)。
总之,如果符合以下条件,则应将CreateProcess
设置为false。
相反,如果你想打开文档,网址或批处理文件等,你应该保持UseShellExecute
为真......而不是必须明确地给出可执行文件的路径。
答案 1 :(得分:12)
我认为主要是针对非可执行文件。例如,如果您尝试打开.html文件,则必须将UseShellExecute
设置为true
,这将在用户默认设置的浏览器中打开.html。
答案 2 :(得分:10)
来自MSDN:
将此属性设置为false启用 你重定向输入,输出和 错误流。
如果,则UseShellExecute必须为false UserName属性不为null或 一个空字符串,或一个 InvalidOperationException将是 扔的时候 Process.Start(ProcessStartInfo)方法 被称为。
使用操作系统时 shell可以启动进程 启动任何文件(任何文件) 注册的文件类型与 具有默认打开的可执行文件 动作)并执行操作 文件,如打印,用 流程组件。什么时候 UseShellExecute是false,你可以 只启动可执行文件 流程组件。
如果你是,那么UseShellExecute必须为true 将ErrorDialog属性设置为true。
答案 3 :(得分:0)
如果我们想隐藏当前的Application可执行文件窗口,那么UseShellExecute应该设置为true
答案 4 :(得分:0)
当路径包含空格或其他特殊字符(即带重音符号)时,CreateProcess(UseShellExecute = false)似乎使用短文件名(“ DOS” 8.3表示法),ShellExecute(UseShellExecute = true)使用长文件名。 因此,当您使用UseShellExecute = false时,请确保将目录和文件名转换为8.3名称(Google“ .net如何获取8.3文件名”)。 (不完全确定哪些Windows版本和/或文件系统以这种方式进行了此操作,并已在Windows 7,NTFS上进行了测试。)