Ein sehr einfaches Beispiel, um sofort festzuhalten:
using System;
using System.Windows.Forms;
class test
{
static void Main()
{
Console.WriteLine("test");
MessageBox.Show("test");
}
}
Wenn ich dies wie erwartet mit Standardoptionen kompiliere (mit csc in der Befehlszeile), wird es zu einer Konsolenanwendung kompiliert. Da ich importiert habe System.Windows.Forms
, wird auch ein Meldungsfeld angezeigt.
Wenn ich nun die Option verwende /target:winexe
, die meiner Meinung nach der Auswahl Windows Application
aus den Projektoptionen entspricht, wird erwartungsgemäß nur das Meldungsfeld und keine Konsolenausgabe angezeigt.
(Sobald es über die Befehlszeile gestartet wird, kann ich den nächsten Befehl ausgeben, bevor die Anwendung überhaupt abgeschlossen ist.)
Meine Frage lautet also: Ich weiß, dass Sie "Windows" / Formulare von einer Konsolenanwendung ausgeben können, aber gibt es trotzdem eine Möglichkeit, die Konsole von einer Windows-Anwendung anzuzeigen?
Antworten:
Dieser sollte funktionieren.
quelle
>
die Ausgabe umzuleiten, wird in meiner Datei ein separates Konsolenfenster und keine Ausgabe angezeigt.Vielleicht ist das zu simpel ...
Erstellen Sie ein Windows Form-Projekt ...
Dann: Projekteigenschaften -> Anwendung -> Ausgabetyp -> Konsolenanwendung
Dann können Konsole und Formulare zusammen laufen, funktioniert für mich
quelle
>
. Ich hatte jedoch auf eine Lösung gehofft, die erklärt, wie man nur teilweise als "Konsolenanwendung" ausgeführt wird (dh programmgesteuert zu aktivieren, was auch immer das Ändern dieser mysteriösen Visual Studio-Einstellung bewirkt). Weiß jemand, wie das unter der Haube funktioniert?Wenn Sie sich keine Gedanken über das Öffnen einer Konsole auf Befehl machen möchten, können Sie die Eigenschaften Ihres Projekts aufrufen und in Konsolenanwendung ändern
.
Dies zeigt weiterhin Ihr Formular an und öffnet ein Konsolenfenster. Sie können das Konsolenfenster nicht schließen, aber es funktioniert als hervorragender temporärer Logger für das Debuggen.
Denken Sie daran, es wieder auszuschalten, bevor Sie das Programm bereitstellen.
quelle
Sie können
AttachConsole
mit pinvoke aufrufen, um ein Konsolenfenster an ein WinForms-Projekt anzuhängen: http://www.csharp411.com/console-output-from-winforms-application/Möglicherweise möchten Sie auch Log4net ( http://logging.apache.org/log4net/index.html ) in Betracht ziehen, um die Protokollausgabe in verschiedenen Konfigurationen zu konfigurieren.
quelle
Dies funktionierte für mich, um die Ausgabe in eine Datei zu leiten. Rufen Sie die Konsole mit an
Fügen Sie diesen Code Ihrer Anwendung hinzu.
Ich habe diesen Code hier gefunden: http://www.csharp411.com/console-output-from-winforms-application/ Ich dachte, es wäre wert, ihn auch hier zu posten.
quelle
AttachConsole(ATTACH_PARENT_PROCESS)
bekomme ich die Konsolenausgabe, aber das Umleiten auf die Kommandozeile mit>
funktioniert nicht. Wenn ich diese Antwort versuche, kann ich weder in der Konsole noch in einer Datei eine Ausgabe erhalten.Grundsätzlich können hier zwei Dinge passieren.
Konsolenausgabe Ein Winforms-Programm kann sich an das Konsolenfenster anhängen, das es erstellt hat (oder an ein anderes Konsolenfenster oder an ein neues Konsolenfenster, falls gewünscht). Einmal an das Konsolenfenster angehängt, funktioniert Console.WriteLine () usw. wie erwartet. Ein Problem bei diesem Ansatz ist, dass das Programm die Steuerung sofort an das Konsolenfenster zurückgibt und dann weiter darauf schreibt, sodass der Benutzer auch das Konsolenfenster eingeben kann. Sie können start mit dem Parameter / wait verwenden, um dies zu handhaben, denke ich.
Link zum Starten der Befehlssyntax
Umgeleitete Konsolenausgabe Dies ist der Fall, wenn jemand die Ausgabe Ihres Programms an eine andere Stelle weiterleitet, z.
yourapp> file.txt
Beim Anschließen an ein Konsolenfenster werden in diesem Fall die Rohrleitungen effektiv ignoriert. Damit dies funktioniert, können Sie Console.OpenStandardOutput () aufrufen, um ein Handle für den Stream abzurufen, an den die Ausgabe weitergeleitet werden soll. Dies funktioniert nur, wenn die Ausgabe weitergeleitet wird. Wenn Sie also beide Szenarien behandeln möchten, müssen Sie die Standardausgabe öffnen, darauf schreiben und an das Konsolenfenster anhängen. Dies bedeutet, dass die Ausgabe an das Konsolenfenster und an die Pipe gesendet wird, aber es ist die beste Lösung, die ich finden konnte. Unter dem Code, den ich dazu benutze.
quelle
Console.WriteLine
um stattdessen dieWriteLine
oben definierte neue aufzurufen . Obwohl ich versucht habe, mit diesem Code nichts in eine Datei umzuleiten, wenn die Anwendung in der Befehlszeile ausgeführt und mit>
in eine Datei umgeleitet wird .Console.WriteLine
nur eine gute Vorgehensweise ist, da Sie damit die Orte, an denen Sie sich anmelden, testen und einfach ändern können (z. B. möchten Sie möglicherweise mit der Protokollierung bei einem Cloud-basierten Protokollierungsdienst wie PaperTrail oder was auch immer beginnen )StreamWriter _stdOutWriter;
Erstellen Sie eine Windows Forms-Anwendung und ändern Sie den Ausgabetyp in Konsole.
Es wird sowohl eine Konsole als auch das Formular geöffnet.
quelle
quelle
quelle
StandardHandle : uint
ist hier falsch ... sollte IntPtr sein, um sowohl auf x86 als auch auf x64 zu arbeitenSie können jederzeit zwischen Anwendungstypen, Konsolen oder Fenstern wechseln. Sie werden also keine spezielle Logik schreiben, um den Standard zu sehen. Wenn Sie eine Anwendung im Debugger ausführen, wird im Ausgabefenster der gesamte Standard angezeigt. Sie können auch einfach einen Haltepunkt hinzufügen und in den Haltepunkteigenschaften "Wenn getroffen ..." ändern, können Sie beliebige Nachrichten und Variablen ausgeben. Sie können auch "Ausführung fortsetzen" aktivieren / deaktivieren, und Ihr Haltepunkt wird quadratisch. Also die Haltepunktmeldungen, ohne etwas in der Anwendung im Debug-Ausgabefenster zu ändern.
quelle
Lassen Sie es einfach als Window Forms-App und erstellen Sie ein einfaches Formular, um die Konsole nachzuahmen. Das Formular kann so gestaltet werden, dass es genau wie die Konsole mit dem schwarzen Bildschirm aussieht und direkt auf Tastendruck reagiert. Anschließend entscheiden Sie in der Datei program.cs, ob Sie das Hauptformular oder die ConsoleForm ausführen müssen. Zum Beispiel verwende ich diesen Ansatz, um die Befehlszeilenargumente in der Datei program.cs zu erfassen. Ich erstelle die ConsoleForm, verstecke sie zunächst und übergebe dann die Befehlszeilenzeichenfolgen an eine darin enthaltene AddCommand-Funktion, die die zulässigen Befehle anzeigt. Schließlich, wenn der Benutzer das -h oder -? Befehl rufe ich die .Show in der ConsoleForm auf und wenn der Benutzer eine Taste darauf drückt, schalte ich das Programm aus. Wenn der Benutzer das - nicht gibt? Befehl schließe ich die versteckte ConsoleForm und führe das Hauptformular aus.
quelle