我们什么时候需要将UseShellExecute设置为True?

时间:2011-03-10 03:24:11

标签: c#

//
// 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?

5 个答案:

答案 0 :(得分:173)

UseShellExecute布尔属性与使用windows ShellExecute函数与CreateProcess函数有关 - 简短的答案是,如果UseShellExecute为真,那么{ {1}}类将使用Process函数,否则将使用ShellExecute

更长的答案是CreateProcess函数用于打开指定的程序或文件 - 它大致相当于在运行对话框中键入要执行的命令并单击OK,这意味着它可以是曾经(例如):

  • 使用默认浏览器打开.html文件或网页,无需知道浏览器是什么,
  • 打开word文档,无需知道Word的安装路径是什么
  • 运行批处理文件
  • 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上进行了测试。)