Как я могу получить вывод консольного приложения при запуске его как процесс в C # DLL - PullRequest
1 голос
/ 20 сентября 2011

Я работаю над методом в DLL.В моем методе я записывал в журнал событий, чтобы я мог определить, все ли работает так, как я ожидаю.Одна из задач, которые я выполняю в этом методе, - это создать процесс и запустить приложение командной строки, и я хочу иметь возможность записать вывод этого, который обычно записывается в консоль, и записать его в журнал событий.

Код:

Process getNextIons = new Process();
getNextIons.StartInfo.FileName = @"""C:\Program Files\OpenMS-    1.6\PrecursorIonSelector.exe""";
getNextIons.StartInfo.Arguments = @"-ini ""C:\Program Files\OpenMS-1.6\precursorionselector.ini""";
getNextIons.StartInfo.UseShellExecute = false;
getNextIons.StartInfo.RedirectStandardOutput = true;
getNextIons.Start();
getNextIons.WaitForExit();
System.Diagnostics.EventLog.WriteEntry("FMANWiff", "IPS: " + getNextIons.StandardOutput.ReadToEnd());

У меня есть консольное тестовое приложение, которое вызывает мой метод, и когда я делаю это, я вижу, что процесс был запущен и работал правильно, однако, когда я на самом деле пытаюсь использоватьDLL, не использующая тестовое приложение, все, что я в итоге вижу, это запись:

IPS: и ничего из вывода.Однако я могу сказать, что он работает, так как я вижу, как обновляется несколько выходных файлов.

Кто-нибудь знает, почему я не получаю никаких выходных данных и как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 16 апреля 2012

Согласно документации Process.StandardOutput ваш код потенциально заблокирован.

Когда вызывающая сторона читает из перенаправленного потока дочернего процесса, это зависит от дочернего процесса. Вызывающая сторона ожидает операции чтения, пока дочерний объект не выполнит запись в поток или не закроет поток. Когда дочерний процесс записывает достаточно данных для заполнения своего перенаправленного потока, он зависит от родительского процесса. Дочерний процесс ожидает следующей операции записи, пока родительский объект не прочитает полный поток или не закроет поток. Условие взаимоблокировки возникает, когда вызывающий и дочерний процессы ожидают друг друга для завершения операции, и ни один из них не может продолжить.

Чтобы избежать возможной тупиковой ситуации, последние две строки вашего примера кода должны быть переключены. Вам также следует рассмотреть возможность перенаправления StandardError.

1 голос
/ 20 сентября 2011

В вашей библиотеке вместо прямой записи в выбранное место вы должны использовать System.Diagnostics.Trace .Используя Trace, вы можете настроить внешнее консольное приложение или подписаться на событие Trace, используя TraceListener .

. Используя Trace и TraceListeners, вы можете сделать ваше приложение адаптируемым к любой ситуации ведения журнала.вам требуется без необходимости изменять библиотеку каждый раз, когда вы хотите изменить систему ведения журнала.

Ниже приведена ссылка на другой поток StackOverflow о ведении журнала трассировки с некоторыми хорошими примерами и информацией.

Как добавить (простую) трассировку в C #?

...