Ich möchte in der Lage sein, mein Programm ähnlich wie wget -b
von der Konsole zu lösen. Ein Codefragment könnte aussehen wie
Aber System.Console.Out.Close();
macht nicht das Richtige.
Um es klarzustellen, das "Richtige" ist, wenn dieses Programm von der Konsole aus ausgeführt wird, sollte die Eingabeaufforderung wieder erscheinen. Oder, wenn Sie dieses Programm von explorer.exe
ausführen, sollte das Konsolenfenster geschlossen werden.
Bitte lassen Sie mich wissen, wenn ich nicht klar bin.
Die Quelle für wget
, auf die Sie verweisen, ist hier verfügbar. Sie werden feststellen, dass in den Zeilen mswindows.c 193 - 314 eine Fork-Prozedur implementiert ist. Sie erzeugen eine neue Instanz von wget
und übergeben ihr die gleichen Parameter.
Die Kommentare sind auch informativ:
Windows unterstützt den Aufruf von fork () nicht; Wir fälschen es also, indem wir eine andere Kopie von Wget mit den gleichen Argumenten aufrufen, mit denen wir aufgerufen wurden.
Und in Zeile 102:
Wenn wir unter Windows 9x von einem 16-Bit-Prozess gestartet wurden, sollte der Elternprozess sofort fortgesetzt werden. Unter NT ... ist dies eine vergebliche Geste, da die Eltern darauf warten, dass wir aufhören, bevor wir fortfahren.
Die kurze Antwort scheint "Mach das nicht."
Es sind 3 Kanäle für jede laufende Konsole verfügbar: STDIN, STDOUT, STDERR. Traditionell müssen alle 3 geschlossen werden, damit eine App die Konsole freigibt.
In Windows scheint es jedoch eine API-Methode dafür zu geben: FreeConsole ... und pinvoke.net .
Bearbeiten: Ein anderer SO-Post sagt, dass es nicht möglich ist, ohne einen Hintergrundprozess zu starten: Wie man eine windowless / Kommandozeilenanwendung zurückbringt, aber im Hintergrund weiter ausführt? ... Unter Unix wäre es genug mit einem fork();
.
Anstatt eine Konsolenanwendung zu erstellen und dann Probleme mit dem Aufruf von FreeConsole , können Sie möglicherweise bekommen, was Sie wollen, indem Sie eine normale Windows-Anwendung ohne GUI erstellen, die AllocConsole / AttachConsole / FreeConsole nach Bedarf.
Auf diese Weise haben Sie eine App, die im Hintergrund ausgeführt werden kann, aber ein Konsolenfenster nach Bedarf anzeigen und ausblenden kann. Obwohl, soweit ich mich erinnere, gibt es einige Unterschiede zwischen diesen Konsolenfenstern und normalen Windows-Eingabeaufforderungen, so dass es für das, was Sie wollen, nicht funktioniert.
Um es klarzustellen, das "Richtige" ist, wenn dieses Programm von der Konsole aus ausgeführt wird, sollte die Eingabeaufforderung wieder erscheinen. Oder, wenn Sie dieses Programm von explorer.exe ausführen, sollte das Konsolenfenster schließen.
Es ist nicht so, dass das "Konsolenfenster [zu] geschlossen werden soll", es soll nicht existieren. Es gibt einen sehr einfachen Weg, um zu bekommen, was Sie wollen: Erstellen Sie keine Konsolen-App. : -)
Wenn Sie über die Befehlszeile erstellen, verwenden Sie CSC /target:winexe ...
. Dadurch wird ein Windows-Programm erstellt, das keiner Befehlszeile zugeordnet wird.
Tags und Links c# console redirectstandardoutput