Предыстория: я изо всех сил пытаюсь добавить возможности командной строки и пакетной обработки к существующему приложению Windows WPF. Когда я обнаруживаю некоторые параметры при запуске, я подавляю появление окна, выполняю некоторую обработку и немедленно закрываю. Теперь, поскольку нет пользовательского интерфейса, я хотел бы вывести некоторые сообщения на stdout / stderr. Рассмотрим следующий код:
namespace WpfConsoleTest
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
Console.WriteLine("Start");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Stop");
Shutdown(0);
}
}
}
Когда я запускаю из командной строки, я ожидаю следующего вывода:
Start
Stop
Но вместо:
C:\test>WpfConsoleTest.exe
C:\test>
Однако вы можете перенаправить вывод:
C:\test>WpfConsoleTest.exe > out.txt
C:\test>type out.txt
Start
Stop
К сожалению, перенаправление на CON не работает:
C:\test>WpfConsoleTest.exe > CON
C:\test>
Другая проблема заключается в том, что WpfConsoleTest.exe завершает работу немедленно после запуска. Так:
C:\test>WpfConsoleTest.exe > out.txt & type out.txt
C:\test>
Но:
C:\test>WpfConsoleTest.exe > out.txt & ping localhost > nul & type out.txt
Start
Stop
Лучшее решение, которое мне удалось найти до сих пор, — использовать start /B /wait:
C:\test>start /B /wait WpfConsoleTest.exe > out.txt & type out.txt
Start
Stop
Этот подход в основном подходит — если вы обернете его в летучую мышь, вы можете сохранить код ошибки и так далее. Единственный серьезный недостаток заключается в том, что вы получаете результат после завершения приложения, то есть вы не можете отслеживать прогресс, вам нужно дождаться завершения всего, что происходит.
Поэтому мой вопрос: Как выводить на родительскую консоль из WPF Windows Application? Кроме того, почему так сложно получить stdout / stderr из WPF?
Я знаю, что могу изменить тип приложения на Console Application в настройках проекта, но это имеет неприятный побочный эффект — окно консоли отображается все время, даже если вы просто дважды щелкните exe. Это решение также не годится, поскольку оно создает новую консоль, даже если приложение было запустить из cmd.
РЕДАКТИРОВАТЬ: чтобы уточнить, я хочу, чтобы мое приложение выводило на существующую консоль, если она есть, и не для создания новой, если она отсутствует.
Аналогичный вопрос: stackoverflow .com / questions / 160587 /. — person gwiazdorrr schedule 02.05.2012
Ссылка на этот вопрос была уже в последнем абзаце моего вопроса. — person gwiazdorrr schedule 02.05.2012
