Когда нам нужно установить для UseShellExecute значение True?


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

Ответы:


203

UseShellExecuteЛогическое свойство связано с использованием окон ShellExecute функции В.С. CreateProcess функции - короткий ответ , что если UseShellExecuteэто верно , то 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является то, что ни один из трех приведенных выше примеров не будет работать (попробуйте и убедитесь).

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

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

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


2
Отличный материал, но вы пишете (с ShellExecute): «[вы утверждаете], что невозможно перенаправить стандартные обработчики ввода / вывода / ошибок» <- Конечно, это неверно или неточно. Даже если для useShellExecute установлено значение true, хотя вы действительно не можете этого сделать processStartInfo.RedirectStandardOutput=true, мне кажется, что вы все равно можете перенаправить стандартный вывод, выполнив process.Arguments= "cmd /c dir >c:\\crp\\a.a". Точно так же вы можете сделать это в диалоговом окне запускаcmd /c dir>c:\crp\a.a
— barlop

4
также вы говорите, что когда, UseShellExecute=falseнапример, CreateProcess, не будет проверять путь, но я вижу, что даже когда я делаю «UseShellExecute = false», то есть якобы не проверяю путь, тогда process.FileName = «cmd.exe» работает, так что это проверка c: \ windows \ system32. И если я скопирую cmd.exe в c: \ windows и назову его cmmmd.exe, тогда я сделаю process1.FileName = "cmmmd.exe", который тоже работает, поэтому он проверяет c: \ windows, так что кажется, что он проверяет путь, или какая-то куча каталогов.
— barlop

2
Документы MSDN соглашаются с @barlop: «Когда UseShellExecute имеет значение false, свойство FileName может быть либо полным путем к исполняемому файлу, либо простым именем исполняемого файла, которое система попытается найти в папках, указанных переменной среды PATH».
— Боб

По обстановке , UseShellExecuteчтобы trueя был в состоянии разделить переменное окружение (которая была создана только в процессе вызова). Очень удобно
— Миткинс

14

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


12

Из MSDN :

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

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

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

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


0

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


0

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


Может быть, это просто отрезание пути в космосе? Помещение кавычек вокруг «пути / имени программы» решает эту проблему.
— gbarry
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.