Что именно делает System.Diagnostics.Process UseShellExecute? - PullRequest
25 голосов
/ 03 марта 2010

У меня есть задача MSBuild, которая выполняет (среди прочего) вызов xcopy. Я обнаружил, что этот вызов xcopy выполняется правильно, когда я запускаю задачу MSBuild из пакетного файла, и не может выполнить или выдать какой-либо вывод, который позволил бы мне понять, что происходит, когда этот же пакетный файл вызывается из другого Приложение C # с 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.

Спасибо.

Ответы [ 4 ]

28 голосов
/ 03 марта 2010

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

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

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

Как правило, использование cmd.exe проблематично, если вы не используете оболочку Windows. Возможно, вы захотите просто написать код для непосредственной обработки вашей «пакетной» операции, т. Е. Использовать методы из типов в пространстве имен System.IO для копирования. Это позволит полностью избежать этой проблемы.

1 голос
/ 03 марта 2010

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

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

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

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

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

0 голосов
/ 03 марта 2010

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

0 голосов
/ 03 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...