Подтвердить что ты не робот

Что именно делает System.Diagnostics.Process UseShellExecute?

У меня есть задача MSBuild, которая выполняет (помимо прочего) вызов xcopy. Я обнаружил, что этот вызов xcopy выполняется правильно, когда я запускаю задачу MSBuild из командного файла и не могу выполнить или произвести какой-либо вывод, который позволил бы мне понять, что происходит, когда тот же командный файл вызывается из другого С# с System.Diagnostics.Process.

Оба процесса запускаются с более или менее одинаковой структурой:

waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;

Кроме того, изменив значение "UseShellExecute" с false на true в команде xcopy, я могу сделать это успешным в обоих случаях использования, однако команда не запускается в третьем варианте использования. Третий вариант использования - наша автоматическая система сборки, которая является службой Windows, вызывающей msbuild напрямую. В случае сбоя на нашей машине для сборки команда копирования зависает бесконечно, что, я считаю, связано с тем, что System.Diagnostics.Process пытается отобразить окно, а службы не имеют сеанса рабочего стола Windows, связанного с ними, поэтому они не могут окна отображения.

Я попытался использовать свойство "CreateNoWindow", и я попытался установить "WindowStyle" в "ProcessWindowStyle.Hidden", но это не меняет поведение на машине сборки.

Все это говорит о том, что я действительно хочу знать о том, что именно имеет свойство UseShellExecute, потому что это, кажется, намного больше, чем предлагает документация MSDN.

Спасибо.

4b9b3361

Ответ 1

ProcessStartInfo.UseShellExecute сообщает процессу использовать оболочку Windows для выполнения указанного приложения.

Без этого набора вы можете напрямую запускать EXE файл. Установив это, вы разрешаете использовать оболочку Windows, которая позволяет такие вещи, как указание файла .doc и наличие связанной программы, открыть файл.

Однако использование Windows Shell требует действительного контекста рабочего стола, поэтому ваш третий вариант использования не работает.

В общем случае использование cmd.exe проблематично, если вы не используете оболочку Windows. Вы можете просто написать код для обработки вашей "пакетной" операции напрямую - то есть: использовать методы из типов в пространстве имен System.IO до сделайте свое копирование. Это позволит полностью избежать этой проблемы.

Ответ 2

Из Документация:

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

Примечание. UseShellExecute должно быть ложным если свойство UserName не является нулевым ссылка (ничего в Visual Basic) или пустую строку или InvalidOperationException будет бросали, когда Способ Process.Start(ProcessStartInfo) называется. Когда вы используете системной оболочки для запуска процессов, вы может начать любой документ (какой-либо тип зарегистрированного файла, связанный с исполняемый файл, который по умолчанию открыт действие) и выполнять операции на файл, например печать, с помощью Технологический компонент. когда UseShellExecute - false, вы можете запускать только исполняемые файлы с помощью Компонент процесса.

Примечание. UseShellExecute должно быть истинным, если вы устанавливаете свойство ErrorDialog правда. Свойство WorkDirectory ведет себя иначе, когда UseShellExecute верен, чем когда UseShellExecute - false. когда UseShellExecute - это правда, Свойство WorkDirectory указывает расположение исполняемого файла. Если WorkDirectory - пустая строка, текущий каталог понимается содержат исполняемый файл.

Когда UseShellExecute является ложным, Свойство WorkingDirectory не используется для поиска исполняемого файла. Вместо этого используемый процессом, который запущен и имеет смысл только в пределах контекст нового процесса.

Ответ 3

Использование "UseShellExecute" IIRC - разрешить проводнику (основной оболочке) выполнить этот процесс, а не .NET runtime.... если кто-то не исправляет меня, что я ошибаюсь...

Ответ 4

Вы указали HandDirectory правильно? Вы можете увидеть фактический вывод своей команды, добавив >c:\log.txt 2>c:\err.txt запустить его с этим дополнением и проверить эти файлы