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