Die Ausgabe einer Konsolenanwendung in Visual Studio anstelle der Konsole

120

Wenn Sie eine Konsolenanwendung in Java mit Eclipse ausführen, wird die Ausgabe in einem Textfeld in der IDE selbst angezeigt, anstatt dass eine Konsole wie in Visual Studio angezeigt wird. Dies ist praktisch, da ich den darin geschriebenen Text auch nach dem Beenden des Programms noch gut nutzen kann, da er erst gelöscht wird, wenn ich ihn erneut ausführe. Ist es möglich, so etwas mit Visual Studio zu erreichen? Ich weiß das anstatt zu tun

System.Console.WriteLine(str);

ich kann

System.Diagnostics.Debug.WriteLine(str);

Aber es ist nicht ganz dasselbe, da im Ausgabefenster viel "Müll" angezeigt wird, wie bei allen geladenen Symbolen und dergleichen.

Ist es noch besser, alles in der IDE selbst erledigen zu lassen, wenn Sie Ihre Anwendung ausführen, anstatt die Konsole auszuführen?

verschlungenes Elysium
quelle
Welche Version von VS verwenden Sie?
Gabe
Haben Sie einen Bereich mit Testergebnissen?
Gabe
Ich habe es nie bemerkt. Ich werde es überprüfen. Soll ich es haben?
verschlang Elysium

Antworten:

52

Klicken Sie im Dialogfeld "Extras" -> "Visual Studio-Optionen" -> "Debuggen" -> "Alle Texte des Ausgabefensters in das Sofortfenster umleiten".

SharpSteve
quelle
68
Ich habe dieses Kontrollkästchen aktiviert, erhalte jedoch weiterhin ein Konsolen-Popup und nichts im Fenster "Ausgabe" (Debug, Test, Build, ..) oder im "Sofortfenster".
GuiSim
6
@EvenLisle Sie müssen den Anwendungstyp wie in stolsviks Antwort in Windows-Anwendung ändern . Die in dieser Antwort erwähnte Option war für mich auf jeden Fall standardmäßig aktiviert.
TooTone
3
Was bedeutet "Alle Text des Ausgabefensters in das unmittelbare Fenster umleiten" genau? Verwenden Sie bei Bedarf verschiedene Kontexte. Ich bin verwirrt über das "unmittelbare Fenster".
Xonatron
11
@TooTone Die Frage lautet eindeutig, ob eine "Konsolenanwendung" nur zu Debugging-Zwecken in etwas anderes geändert werden soll, wo ich nicht einmal Console.ReadKey () verwenden kann. Das ist einfach lächerlich!
MickyD
1
Funktioniert nur mit Debug.WriteLine (), funktioniert nicht mit Console.WriteLine () :(
Y2i
45

Im Visual Studio Optionen Dialog -> Debuggen -> Überprüfen Sie die „Redirect Alle Ausgabefenster Text auf dem Direkt - Fenster“. Gehen Sie dann zu Ihren Projekteinstellungen und ändern Sie den Typ von "Konsolenanwendung" in "Windows-Anwendung". Zu diesem Zeitpunkt öffnet Visual Studio kein Konsolenfenster mehr und die Ausgabe wird in Visual Studio in das Ausgabefenster umgeleitet. Sie können jedoch nichts "Kreatives" tun, z. B. eine Schlüssel- oder Texteingabe anfordern oder die Konsole löschen - es werden Laufzeitausnahmen angezeigt.

stolsvik
quelle
25
Ich finde das besonders ungeschickt. Was ist wohl die Begründung dafür in VS? Es sollte die Fähigkeit aller modernen IDEs sein, ein Panel innerhalb der IDE selbst als Konsole für die Eingabe und Ausgabe zu haben. (kratzt sich am Kopf)
12
Die Frage lautet eindeutig, ob eine "Konsolenanwendung" nur zu Debugging-Zwecken in etwas anderes geändert werden soll, wo ich nicht einmal Console.ReadKey()einfach lächerlich sein kann!
MickyD
Ich weiß nicht warum, aber als ich versuchte, Output typemeine Anwendung von der Windows-Anwendung auf die Konsole zurückzusetzen, ist das Konsolenfenster beim Ausführen meiner Anwendung nicht mehr zu sehen. Ich kann die Anwendung debuggen und der MainEinstiegspunkt wird ebenfalls getroffen. Ich habe auch die in diesem Beitrag erwähnte Optionseinstellung zurückgesetzt, aber ohne Erfolg. Ich verwende die VS 2017 Community Edition. Ich habe mein Konsolenfenster verloren (schluchzend).
RBT
3
Für VS 15.8.7 war die einzige Möglichkeit, die Ausgabe für eine Konsolen-App umzuleiten, die Änderung in eine Windows-App und das Kontrollkästchen Umleitung UNCHECKED. Wenn ich das Kontrollkästchen aktiviere, wird die Ausgabe nicht angezeigt.
dpberry178
6

Verwenden System.Diagnostics.Trace

Abhängig davon, welche Listener Sie anhängen, kann die Trace-Ausgabe gleichzeitig an das Debug-Fenster, die Konsole, eine Datei, eine Datenbank oder alle gesendet werden. Die Möglichkeiten sind buchstäblich endlos, da die Implementierung Ihres eigenen TraceListener äußerst einfach ist.

Joel Coehoorn
quelle
Ja, aber ich möchte wissen, ob es möglich ist, es einfach zu tun, ohne es selbst implementieren zu müssen.
verschlang Elysium
@devoured Die Trace-Klasse wird standardmäßig nur im Debug-Fenster ausgegeben. Sie müssen nur zusätzliche Listener anhängen (und es gibt mehrere bereits geschriebene, die Sie verwenden können), wenn Sie die Ausgabe auch an anderer Stelle anzeigen möchten.
Joel Coehoorn
1
Ich ging zu meinem Dialogfeld "Debug-Optionen" und wählte "Alle Texte des Ausgabefensters in das Sofortfenster umleiten", damit die Trace-Ausgabe in das Sofortfenster wechselt, damit nicht alles mit dem Debug-Mist verwechselt wird.
Gabe
2

Es ist Zeit, die neuesten Versionen für Visual Studio zu überprüfen, Leute. Die am meisten vorgeschlagene Lösung, die für einige von Ihnen zuvor nicht funktioniert hat, funktioniert jetzt möglicherweise.

In Visual Studio 2017 ( Release Version 15.4.2 und höher) hat go Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowfür mich funktioniert.

Einige Hinweise: 1. Um das Sofortfenster anzuzeigen, stellen Sie sicher, dass Sie sich im Debugging- Modus befinden. 2. Es sollten jetzt 3 weitere Debugging-Tools zur Verfügung stehen, nämlich Call Stack, Haltepunkte und Befehlsfenster (siehe unten):

Geben Sie hier die Bildbeschreibung ein

Die besten Wünsche!

kuzevni
quelle
In Version 15.9.4 getestet, funktioniert nicht (zumindest nicht für eine Konsolenanwendung).
bta
Hmm. Wenn Sie einen Screenshot Ihrer Konfigurationen freigeben können, kann ich versuchen, das Problem auf meiner Seite zu replizieren. Andernfalls können Sie Ihre Lösung freigeben, wenn sie behoben wurde. Versionshinweise für Visual Studio 15.9.4 finden Sie unter docs.microsoft.com/en-us/visualstudio/releasenotes/…. Abhängig von Ihrer Umgebung finden Sie dort möglicherweise einige hilfreiche Tipps. Visual Studio 2017 (Ausgabefenster) Dokumentation : docs.microsoft.com/en-us/visualstudio/ide/reference/…
kuzevni
Überprüfen Sie, ob das Projekt, mit dem Sie testen, als "Konsolenanwendung" und nicht als "Windows-Anwendung" erstellt wurde. Ihr Ansatz funktioniert mit einer Windows-Anwendung, aber das ist nicht das, was das OP angegeben hat.
bta
1

Sie können eine Wrapper-Anwendung erstellen, die Sie ausführen, anstatt Ihre echte App direkt auszuführen. Die Wrapper-Anwendung kann stdout abhören und alles an Trace umleiten. Ändern Sie dann die Ausführungseinstellungen, um Ihren Wrapper zu starten, und übergeben Sie den Pfad zur Ausführung der realen App.

Sie können den Debugger auch automatisch an den neuen Prozess anhängen lassen, wenn ein Debugger an den Wrapper angehängt ist.

Samuel Neff
quelle
0

Ich weiß, dass dies nur eine andere Antwort ist, aber ich dachte, ich würde etwas für die neuen Webentwickler aufschreiben, die möglicherweise über den Teil "Ändern zu einer Windows-Anwendung" verwirrt sind, da ich standardmäßig eine MVC-Anwendung in Visual Studio 2013 denke Standardmäßig wird ein Ausgabetyp der Klassenbibliothek verwendet.

Meine Webanwendung ist standardmäßig als Ausgabetyp "Klassenbibliothek" festgelegt. Das musst du nicht ändern. Alles, was ich tun musste, war den Vorschlägen zu folgen, indem ich zu Extras> Optionen> Debuggen> Den gesamten Text des Ausgabefensters zum Sofortfenster umleiten ging. Ich habe dann den System.Diagnostics.TraceVorschlag von Joel Coehoorn oben verwendet.

Joshmcode
quelle
0

Eine einfache Lösung, die für mich funktioniert, um mit Konsolenfähigkeiten (ReadKey, String mit Format und Argument usw.) zu arbeiten und die Ausgabe anzuzeigen und zu speichern:

Ich schreibe TextWriter, der an Consoleund zu schreibt Traceund den Console.Outdurch ihn ersetzt.

Wenn Sie Dialog -> Debugging -> Aktivieren Sie das Kontrollkästchen "Text des gesamten Ausgabefensters in das unmittelbare Fenster umleiten", wird es im sofortigen Fenster angezeigt und ist ziemlich sauber.

mein Code: am Anfang meines Codes:

   Console.SetOut(new TextHelper());

und die Klasse:

public class TextHelper : TextWriter
    {
        TextWriter console;

        public TextHelper() {
            console = Console.Out;
        }

        public override Encoding Encoding { get { return this.console.Encoding; } }
        public override void WriteLine(string format, params object[] arg)
        {
            string s = string.Format(format, arg);
            WriteLine(s);
        }
        public override void Write(object value)
        {
            console.Write(value);
            System.Diagnostics.Trace.Write(value);
        }

        public override void WriteLine(object value)
        {
            Write(value);
            Write("\n");
        }
        public override void WriteLine(string value)
        {
            console.WriteLine(value);
            System.Diagnostics.Trace.WriteLine(value);

        }

    }

Hinweis: Ich überschreibe genau das, was ich brauchte. Wenn Sie also andere Typen schreiben, sollten Sie mehr überschreiben

Sarel Foyerlicht
quelle
0

bezüglich der System.Diagnostics.DebugErzeugung von viel "Junk" im Ausgabefenster: Sie können dies deaktivieren, indem Sie mit der rechten Maustaste in das Ausgabefenster klicken. ZB gibt es einen Punkt "Module Load Messages", den Sie deaktivieren möchten, und einen Punkt "Program Output", den Sie behalten möchten.

user829755
quelle
0

Sie haben drei Möglichkeiten, dies zu tun, aber es ist nicht trivial. Die Hauptidee aller IDEs ist, dass alle die Eltern der untergeordneten (Debug-) Prozesse sind. In diesem Fall ist es möglich, mit Standardeingabe-, Ausgabe- und Fehlerbehandlungsroutine zu manipulieren. IDEs starten also untergeordnete Anwendungen und leiten sie in das interne Ausgabefenster um. Ich kenne eine weitere Möglichkeit, aber sie wird in Zukunft kommen

  1. Sie können Ihre eigene Debug-Engine für Visual Studio implementieren. Starten und Debuggen der Debug-Engine-Steuerung für die Anwendung. Beispiele hierfür finden Sie unter docs.microsoft.com ( Visual Studio Debug Engine ).
  2. Leiten Sie die Formularanwendung mithilfe der Duplizierung des Standardhandlers für c ++ um oder verwenden Sie Console.SetOut (TextWriter) für c #. Wenn Sie in das Ausgabefenster drucken müssen, müssen Sie das Visual Studio-Erweiterungs-SDK verwenden. Beispiel für die zweite Variante finden Sie auf Github .
  3. Starten Sie die Anwendung, die System.Diagnostics.Debug.WriteLine verwendet (zum Drucken in die Ausgabe), und starten Sie dann die untergeordnete Anwendung. Wenn Sie ein Kind starten, müssen Sie stdout mit Pipes in das übergeordnete Element umleiten. Sie könnten ein Beispiel auf MSDN finden. Aber ich denke, das ist nicht der beste Weg.
Galina Khrychikova
quelle
0

Wenn Sie eine Ausgabe von Console.WriteLine benötigen und der Text des gesamten Ausgabefensters in das Sofortfenster umleiten nicht funktioniert und Sie die Ausgabe von Tests aus dem integrierten Test-Explorer mit NUnit.Framework kennen müssen, ist unser Problem bereits bei VS 2017 gelöst ::

Beispiel aus C # In Depth von Jon Skeet: Beispiel aus C # In Depth von Jon Skeet Dies erzeugt diese Ausgabe im Text Explorer: Aufgaben-Explorer

Wenn wir rechts unter Verstrichene Zeit auf Blaue Ausgabe klicken, wird Folgendes angezeigt: Standardausgabe

Die Standardausgabe ist unsere gewünschte Ausgabe, die von Console.WriteLine erstellt wird.

Es funktioniert für die Konsole und für Windows Form-Anwendungen bei VS 2017, jedoch nur für die Ausgabe, die beim Debuggen oder Ausführen für den Test Explorer generiert wurde. Auf jeden Fall ist dies mein Hauptbedarf an Console.WriteLine-Ausgabe.

Marcelo Scofano
quelle
-1

Stattdessen können Sie die Ausgabe in einem Testergebnis sammeln.

Sie können keine Eingabe bereitstellen, aber Sie können problemlos mehrere Tests mit unterschiedlichen Befehlszeilenargumenten bereitstellen, wobei jeder Test die Ausgabe sammelt.

Wenn Ihr Ziel das Debuggen ist, können Sie mit geringem Aufwand ein wiederholbares Debugging-Szenario anbieten.

namespace Commandline.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}
uffehellum
quelle
-7

Schritt 1: Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen und legen Sie den Ausgabetyp als Fensteranwendung fest

Schritt 2: Debuggen -> Optionen ..--> Debuggen (Erweitern) -> Allgemein -> Leiten Sie den gesamten Text des Ausgabefensters in das Direktfenster um

Balaji Dinakaran
quelle
3
Diese Antwort wurde bereits dreimal gegeben. Die gestellte Frage wird nicht behandelt.
Klay