Коли нам потрібно встановити UseShellExecute на True?


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

Відповіді:


202

UseShellExecuteЛогічне властивість пов'язана з використанням вікон ShellExecute функції В.С. CreateProcess функції - коротка відповідь , що якщо UseShellExecuteце вірно , то Processклас буде використовувати ShellExecuteфункцію, в іншому випадку він буде використовувати CreateProcess.

Більш довга відповідь полягає в тому, що ShellExecuteфункція використовується для відкриття заданої програми або файлу - це приблизно рівнозначно набравши команду, яку потрібно виконати в діалоговому вікні запуску, і натиснути кнопку ОК, що означає, що її можна використовувати (наприклад):

  • Відкрийте .html файли чи Інтернет за допомогою браузера за замовчуванням, не знаючи, що це за браузер,
  • Відкрийте документ слова, не знаючи, що таке інсталяційний шлях для 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однак є те, що жоден із наведених вище 3 прикладів не спрацює (спробуйте і подивіться).

Підсумовуючи, слід встановити 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
барлоп

4
Крім того, ви говорите, що коли UseShellExecute=falseCreateProcess не перевіряє шлях, але я бачу, що навіть коли я виконую "UseShellExecute = false", тобто нібито не перевіряє шлях, тоді process.FileName = "cmd.exe" працює так перевірка c: \ windows \ system32. І якщо я копіюю cmd.exe в c: \ windows і називаю його cmmmd.exe, то я роблю process1.FileName = "cmmmd.exe", який працює занадто, тому він перевіряє c: \ windows, тому здається, що він перевіряє шлях, або кілька довідників.
барлоп

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

Встановивши UseShellExecuteна trueмене, я зміг поділитися змінною середовища (яка була створена лише в процесі виклику). Дуже зручно
Міткінс

14

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


12

Від MSDN :

Якщо встановити цю властивість як false, ви можете перенаправляти потоки вводу, виводу та помилок.

UseShellExecute повинен бути помилковим, якщо властивість UserName не є нульовим або порожнім рядком, або якщо InvalidOperationException буде викинуто, коли викликається метод Process.Start (ProcessStartInfo).

Коли ви використовуєте оболонку операційної системи для запуску процесів, ви можете запустити будь-який документ (який є будь-яким зареєстрованим типом файлу, пов'язаним з виконуваним файлом, який має дію відкритого типу за замовчуванням) і виконувати операції над файлом, наприклад, друк, з компонентом Process. Якщо UseShellExecute помилковий, ви можете запускати лише виконувані файли з компонентом Process.

UseShellExecute має бути істинним, якщо ви встановите для властивості 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.