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