Справочная информация. Я пытаюсь добавить возможности командной строки и пакетной обработки в существующее приложение WPF Windows. Когда я обнаруживаю некоторые параметры при запуске, я подавляю окно от появления, выполняю некоторую обработку и завершаю сразу. Теперь, поскольку нет UI, я бы хотел вывести некоторые сообщения в 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 завершает работу instantietaly. Итак:
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?. Почему так сложно захватить stdout/stderr из WPF?
Я знаю, что я могу изменить тип приложения на Консольное приложение в настройках проекта, но у этого есть неприятный побочный эффект - окно консоли видимо постоянно, даже если вы просто дважды щелкните EXE. Это решение также не будет выполнено, поскольку оно создает консоль новую, даже если приложение было запущено из cmd.
РЕДАКТИРОВАТЬ: я хочу, чтобы мое приложение выводилось в консоль существующей, если есть один и не, чтобы создать новый, если он отсутствует.