背景: コマンドラインとバッチ処理機能を既存の WPF Windows Applicationに追加するのに苦労しています。起動時にいくつかのオプションを検出すると、ウィンドウが表示されないようにし、何らかの処理を行ってすぐに終了します。さて、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>
もう 1 つの問題は、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
このアプローチはほとんど問題ありません。バットでラップすると、エラー コードなどを保持できます。1 つの大きな欠点は、アプリケーションの終了後に出力が得られることです。つまり、進行状況を追跡する方法がなく、進行中の処理が完了するまで待機する必要があります。
したがって、私の質問は次のとおりです。WPF Windows Applicationから親コンソールに出力する方法は? また、WPF から stdout/stderr を取得するのが難しいのはなぜですか?
プロジェクト設定でアプリケーション タイプをコンソール アプリケーションに変更できることはわかっていますが、これには厄介な副作用があります。単に exe をダブルクリックしても、コンソール ウィンドウが常に表示されます。アプリケーションがcmdから実行されたとしても、新しいコンソールを作成するため、このソリューションも機能しません。
編集:明確にするために、アプリが存在する場合は既存のコンソールに出力し、存在しない場合は新しいコンソールを作成しないようにします。