Когда нам нужно установить UseShellExecute в True?

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

Ответ 1

Логическое свойство UseShellExecute связано с использованием функции Windows ShellExecute против функции CreateProcess - краткий ответ заключается в том, что если UseShellExecute равно true, то класс Process будет использовать функцию ShellExecute, в противном случае она будет использовать CreateProcess.

Более длинный ответ заключается в том, что функция ShellExecute используется для открытия указанной программы или файла - это примерно равносильно вводу команды, которая должна быть выполнена в диалоговом окне запуска, и нажатию кнопки "ОК", что означает, что ее можно использовать (например, ):

  • Откройте файлы .html или Интернет с помощью браузера по умолчанию, не зная, что это за браузер,
  • Откройте документ Word, не зная, каков путь установки Word
  • .Запустить пакетные файлы
  • Запустите любую команду на 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 - гораздо более точный способ запуска процесса - он не ищет путь и позволяет перенаправить стандартный ввод или вывод дочернего процесса (среди прочего). Однако недостаток CreateProcess заключается в том, что ни один из 4 приведенных выше примеров не сработает (попробуйте и посмотрите).

Таким образом, вы должны установить UseShellExecute в false, если:

  • Вы хотите перенаправить стандартный ввод/вывод/ошибку (это наиболее распространенная причина)
  • Вы не хотите искать путь к исполняемому файлу (например, по соображениям безопасности)

И наоборот, вы должны сохранять UseShellExecute true, если вы хотите открывать документы, URL-адреса или пакетные файлы и т.д., Вместо того, чтобы явно указывать путь к исполняемому файлу.

Ответ 2

Я думаю, что в основном для не исполняемых файлов. Например, если вы пытаетесь открыть .html файл, если вам нужно установить UseShellExecute в true, и он откроет .html в браузере, установленном пользователем по умолчанию.

Ответ 3

От MSDN:

Установка этого свойства в значение false позволяет вы перенаправляете ввод, вывод и потоки ошибок.

UseShellExecute должен быть ложным, если свойство UserName не равно null или пустую строку или InvalidOperationException будет бросали, когда Способ Process.Start(ProcessStartInfo) называется.

При использовании операционной системы shell для запуска процессов, вы можете запустите любой документ (какой-либо тип зарегистрированного файла, связанный с исполняемый файл, который по умолчанию открыт действие) и выполнять операции на файл, например печать, с помощью Технологический компонент. когда UseShellExecute - false, вы можете запускать только исполняемые файлы с помощью Компонент процесса.

UseShellExecute должен быть правдой, если вы установите для свойства ErrorDialog значение true.

Ответ 4

Если мы хотим скрыть текущее исполняемое окно приложения, то UseShellExecute должно быть установлено в true

Ответ 5

Когда путь содержит пробел или некоторые другие специальные (то есть акцентированные) символы, CreateProcess (UseShellExecute = false), по-видимому, использует короткие имена файлов ("DOS" 8.3 нотация), ShellExecute (UseShellExecute = true) использует длинные имена файлов. Поэтому, когда вы используете UseShellExecute = false, убедитесь, что вы преобразовали имена каталогов и файлов в имена 8.3 (google ".net как получить имя файла 8.3"). (Не знаю точно, какие версии Windows и/или файловые системы делают это таким образом, протестировано в Windows 7, NTFS.)