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-адреси чи пакетні файли тощо ..., а не явно давати шлях виконуваному файлу.
processStartInfo.RedirectStandardOutput=true, мені здається, ви все одно можете перенаправляти стандартний вихід, виконуючи цеprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Точно так само з діалогового вікна запуску ви можете зробитиcmd /c dir>c:\crp\a.a