Ungültiges Handle nach Aufruf von FreeConsole in C#?
Hallo.
In einer WPF Anwendung versuche ich fürs Debuggen, dass die Logs Live in eine Konsole geschrieben werden. Um die Konsole in der WPF App überhaupt anzuzeigen und wieder verschwinden zu lassen nutze ich diese Kernel Imports
[LibraryImport("kernel32.dll", SetLastError = true)]
internal static partial int AllocConsole();
[LibraryImport("kernel32.dll", SetLastError = true)]
internal static partial int FreeConsole();
Das klappt auch alles soweit, allerdings habe ich das Problem, dass wenn nach dem FreeConsole aufgerufen wurde in die Konsole geschrieben wird, dass dann eine IOException mit der Message "Das Handle ist ungültig." geworfen wird.
Weiß jemand wie man das beheben und vlt. auch welche Bedeutung die Rückgabewerte beider Imports haben?
1 Antwort
Weiß jemand wie man das beheben (...)
Mit FreeConsole löst du dich (bzw. den Prozess deines Programms) von der Konsole. Das heißt, du hast auf sie auch keinen Zugriff mehr. Du müsstest dich erst mit AttachConsole oder AllocConsole an eine Konsole binden, um wieder schreiben zu können.
(...) und vlt. auch welche Bedeutung die Rückgabewerte beider Imports haben?
Der Rückgabewert gibt bei beiden Funktionen jeweils an, ob die Aktion erfolgreich war. In dem Fall muss er ungleich 0 sein.
Du kannst schauen, ob du das Vorhandensein der Konsole vor dem Schreiben mit GetConsoleWindow prüfen kannst. Andernfalls - nein, löse deinen Prozess entweder nicht von der Konsole, bevor absolut sicher ist, dass sie nicht mehr benötigt wird oder fange die Exception mit try-catch auf.
Was ich noch probiert hatte war, dass ich mit Console.SetOut(TextWriter.Null); quasi die Ausgabe für das Schreiben überschrieben habe und dann wurde auch keine Exception mehr geworfen, allerdings wurde nach AllocConsole auch nichts mehr geschrieben. Gibt es noch eine Möglichkeit um dann an den Ausgabe Stream der mit AllocConsole geöffneten Konsole zu kommen?
Naja, du hast den Ausgabekanal überschrieben, was nun nicht sonderlich sinnvoll ist. Wieso schreibst du deine Logdaten nicht einfach in eine Textdatei (bzw. an sich können sie z.T. noch im Speicher gehalten und erst ab einer bestimmten Länge oder bei bestimmten Events persistent geschrieben werden)? Wenn sie im Programm angezeigt werden sollen, lädst du sie und fügst sie beispielsweise in ein Label ein.
Die Logs werden auch in eine Datei geschrieben, aber ich meine halt während des Debuggen um die Logs Live zu sehen. Dann muss ich eben schauen das während die Konsole nicht 'da' ist nichts in die Konsolen Ausgabe schreibe.
Eine letzte Frage hätte ich da noch. Als ich dazu recherchiert habe bin ich noch auf den Import AttachConsole gestoßen und dem Namen nach müsste diese doch auch eine Konsole Anhängen, allerdings ist nichts passiert beim Aufruf egal ob eine Konsole bereits Allocatet war oder nicht.
Aber nur für das Logging brauchst du doch eigentlich keine Konsole. Mehr Funktionalität als das Speichern von Text ist nicht nötig.
Mit AttachConsole kannst du dich an eine bestehende Konsole eines anderen bestehenden Prozesses hängen. Du brauchst also eine Prozess-ID, die du der Funktion mitgeben kannst.
Kann man es so beheben das auch wenn die Konsole gelöst wurde keine Exception geworden wird sobald ich versuche zu schreiben?