Когда нам нужно установить для UseShellExecute значение True? - PullRequest
113 голосов
/ 10 марта 2011
//
// 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 ]

177 голосов
/ 10 марта 2011

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

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

  • открытия файлов .html или Интернета с помощью браузера по умолчанию без необходимости знатьчто это за браузер,
  • Откройте документ Word без необходимости знать, какой путь установки для Word
  • Запустить пакетные файлы
  • Запустить любую команду на PATH

Например:

Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();

Он очень прост в использовании, универсален и мощен, однако имеет некоторые недостатки:

  • Это невозможноперенаправить стандартrd ввод / вывод / ошибки
  • Нельзя указывать дескрипторы безопасности (или другие интересные вещи) для дочернего процесса
  • Существует вероятность появления уязвимостей безопасности, есливы делаете предположения о том, что на самом деле будет выполняться:

    // 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-адреса, пакетные файлы и т. Д., Вместо того, чтобы явно указывать путь к исполняемому файлу.

13 голосов
/ 10 марта 2011

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

11 голосов
/ 10 марта 2011

С MSDN :

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

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

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

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

0 голосов
/ 20 августа 2018

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

0 голосов
/ 09 августа 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...