Geben Sie Console.WriteLine aus WPF Windows Applications in die aktuelle Konsole aus

Hintergrund: Ich habe Mühe, einer vorhandenen WPF Befehlszeilen- und Stapelverarbeitungsfunktionen hinzuzufügenWindows-Anwendung. Wenn ich beim Start einige Optionen erkenne, unterdrücke ich das Erscheinen des Fensters, führe eine Verarbeitung durch und beende es sofort. Nun, da es keine Benutzeroberfläche gibt, möchte ich einige Nachrichten an stdout / stderr ausgeben. Betrachten Sie folgenden Code:

<code>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);
        }
    }
}
</code>

Wenn ich von der Kommandozeile aus starte, würde ich folgende Ausgabe erwarten:

<code>Start
Stop
</code>

Aber stattdessen:

<code>C:\test>WpfConsoleTest.exe

C:\test>
</code>

Siekönnen Ausgabe umleiten, obwohl:

<code>C:\test>WpfConsoleTest.exe > out.txt

C:\test>type out.txt
Start
Stop
</code>

Die Umleitung zu CON funktioniert leider nicht:

<code>C:\test>WpfConsoleTest.exe > CON

C:\test>
</code>

Ein weiteres Problem ist, dass WpfConsoleTest.exe beendet wirdsofort nach dem Start. So:

<code>C:\test>WpfConsoleTest.exe > out.txt & type out.txt

C:\test>
</code>

Aber:

<code>C:\test>WpfConsoleTest.exe > out.txt & ping localhost > nul & type out.txt
Start
Stop
</code>

Die beste Lösung, die ich bisher finden konnte, ist die Verwendungstart /B /wait:

<code>C:\test>start /B /wait WpfConsoleTest.exe > out.txt & type out.txt
Start
Stop
</code>

Dieser Ansatz ist größtenteils in Ordnung - wenn Sie ihn in eine Fledermaus einwickeln, können Sie den Fehlercode beibehalten und so weiter. Der einzige große Nachteil ist, dass Sie nach dem Beenden der Anwendung eine Ausgabe erhalten, d. H. Sie können den Fortschritt nicht nachverfolgen. Sie müssen warten, bis der Vorgang abgeschlossen ist.

Daher ist meine Frage:Ausgabe von WPF auf die übergeordnete KonsoleWindows-Anwendung? Warum ist es so schwierig, stdout / stderr aus WPF zu holen?

Ich weiß, dass ich den Anwendungstyp auf ändern kannKonsolenanwendung In den Projekteinstellungen hat dies jedoch einen unangenehmen Nebeneffekt: Das Konsolenfenster ist immer sichtbar, auch wenn Sie einfach auf die Exe doppelklicken.Diese Lösung geht auch nicht, weil es schafftein neuer Konsole, auch wenn die Anwendung von cmd ausgeführt wurde.

BEARBEITEN: Zur Verdeutlichung möchte ich meine App auf die ausgebenbestehender Konsole, wenn es eine und gibtnicht um ein neues zu erstellen, wenn es fehlt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage