Когда нам нужно установить для UseShellExecute значение True?
//
// 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?
5 ответов
UseShellExecute
логическое свойство связано с использованием функции Windows 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
однако ни один из 4 приведенных выше примеров не сработает (попробуйте и посмотрите).
Таким образом, вы должны установить UseShellExecute
в ложь, если:
- Вы хотите перенаправить стандартный ввод / вывод / ошибку (это самая распространенная причина)
- Вы не хотите искать путь для исполняемого файла (например, по соображениям безопасности)
И наоборот, вы должны сохранить UseShellExecute
Значение true, если вы хотите открывать документы, URL-адреса или пакетные файлы и т. д. вместо того, чтобы явно указывать путь к исполняемому файлу.
Я думаю в основном для неисполняемых файлов. Например, если вы пытаетесь открыть файл.html, если вам придется установить UseShellExecute
в true
и это откроет.html в браузере, который установлен по умолчанию пользователем.
Из MSDN:
Если для этого свойства установлено значение false, вы сможете перенаправлять потоки ввода, вывода и ошибок.
UseShellExecute должно иметь значение false, если свойство UserName не равно NULL или не является пустой строкой, или будет вызвано исключение InvalidOperationException при вызове метода Process.Start(ProcessStartInfo).
Когда вы используете оболочку операционной системы для запуска процессов, вы можете запустить любой документ (который относится к любому зарегистрированному типу файла, связанному с исполняемым файлом с действием по умолчанию) и выполнять операции с файлом, такие как печать, с компонентом Process. Когда UseShellExecute имеет значение false, вы можете запускать только исполняемые файлы с компонентом Process.
UseShellExecute должно иметь значение true, если для свойства ErrorDialog установлено значение true.
Когда путь содержит пробел или некоторые другие специальные (т.е. акцентированные) символы, CreateProcess (UseShellExecute=false), кажется, использует короткие имена файлов ("DOS" 8.3 нотация), ShellExecute (UseShellExecute=true) использует длинные имена файлов. Поэтому, когда вы используете UseShellExecute=false, убедитесь, что вы преобразовали имена каталогов и файлов в имена 8.3 (google ".net как получить имя файла 8.3"). (Не знаю точно, какие версии Windows и / или файловые системы делают это таким образом, протестировано в Windows 7, NTFS.)
Если мы хотим скрыть текущее исполняемое окно приложения, то для UseShellExecute должно быть установлено значение true