Avere l'output di un'applicazione console in Visual Studio invece della console


120

Quando eseguo un'applicazione console in Java con Eclipse, vedo l'output inserito in una casella di testo nell'IDE stesso, invece di avere una console che si apre come in Visual Studio. Questo è utile, poiché anche dopo che il programma è uscito, posso ancora fare buon uso del testo che è stato scritto in esso, poiché non viene cancellato finché non lo eseguo di nuovo. È possibile ottenere qualcosa di simile con Visual Studio? Lo so invece di farlo

System.Console.WriteLine(str);

posso fare

System.Diagnostics.Debug.WriteLine(str);

ma non è proprio la stessa cosa, poiché nella finestra di output si ottiene un sacco di "spazzatura", come tutti i simboli caricati e simili.

Ancora meglio, è possibile fare tutto nell'IDE stesso, quando esegui l'applicazione, invece di avere la console in esecuzione?


Quale versione di VS stai usando?
Gabe

Hai un riquadro dei risultati del test?
Gabe

Non l'ho mai notato. Controllerò. Dovrei averlo?
elisio divorato il

Risposte:


52

In Strumenti -> Finestra di dialogo Opzioni di Visual Studio -> Debug -> Seleziona "Reindirizza tutto il testo della finestra di output nella finestra immediata".


68
Ho selezionato questa casella di controllo, ma continuo a visualizzare un popup della console e nulla nella finestra "Output" (Debug, Test, Build, ..) o nella "Finestra immediata".
GuiSim

6
@EvenLisle è necessario modificare il tipo di applicazione in Applicazione Windows come nella risposta di stolsvik . L'opzione menzionata in questa risposta era comunque attiva di default per me.
TooTone

3
Che cosa significa esattamente "Reindirizza tutto il testo della finestra di output nella finestra immediata"? Usa vari contesti se necessario. Sono confuso da cosa sia la "finestra immediata".
Xonatron

11
@TooTone La domanda afferma chiaramente per una "applicazione console" e cambiarla in qualcos'altro solo per scopi di debug, dove non posso nemmeno Console.ReadKey () è semplicemente ridicolo!
MickyD

1
Funziona solo con Debug.WriteLine (), non funziona con Console.WriteLine () :(
Y2i

45

Nella finestra di dialogo Opzioni di Visual Studio -> Debug -> seleziona "Reindirizza tutto il testo della finestra di output nella finestra immediata". Quindi vai alle impostazioni del tuo progetto e cambia il tipo da "Applicazione console" a "Applicazione Windows". A quel punto Visual Studio non apre più una finestra della console e l'output viene reindirizzato alla finestra Output in Visual Studio. Tuttavia, non puoi fare nulla di "creativo", come richiedere la chiave o l'immissione di testo o cancellare la console: otterrai eccezioni di runtime.


25
Lo trovo particolarmente goffo. Qual è, mi chiedo, la logica alla base di questo in VS? Dovrebbe essere la capacità di tutti gli IDE moderni di avere un pannello all'interno dell'IDE stesso che si comporta come la console per l'input e l'output. (graffi la testa)

12
La domanda afferma chiaramente per una "applicazione console" e cambiarla in qualcos'altro solo per scopi di debug, dove non posso nemmeno Console.ReadKey()è semplicemente ridicolo!
MickyD

Non sono sicuro del perché, ma quando ho provato a ripristinare la Output typemia applicazione dall'applicazione Windows alla console, la finestra della console non è visibile quando eseguo la mia applicazione. Sono in grado di eseguire il debug dell'applicazione e anche il Mainpunto di ingresso viene colpito. Ho anche ripristinato l'impostazione dell'opzione menzionata in questo post ma senza alcun risultato. Sto usando l'edizione della community di VS 2017. Ho perso la finestra della mia console (singhiozzando).
RBT

3
Per quello che vale, in VS 15.8.7 l'unico modo per ottenere l'output da reindirizzare per un'app console era cambiarlo in un'app Windows e lasciare la casella Reindirizzamento NON SELEZIONATA. Se seleziono la casella, non visualizza l'output.
dpberry178

6

Uso System.Diagnostics.Trace

A seconda dei listener allegati, l'output della traccia può andare nella finestra di debug, nella console, in un file, nel database o tutto in una volta. Le possibilità sono letteralmente infinite, poiché implementare il tuo TraceListener è estremamente semplice.


Sì, ma quello che voglio sapere è se è possibile farlo semplicemente, senza doverlo implementare da solo.
elisio divorato il

@devoured La classe Trace esegue l'output solo nella finestra di debug per impostazione predefinita. Hai solo bisogno di allegare ascoltatori extra (e ce ne sono molti già scritti che puoi usare) se vuoi vedere l'output anche altrove.
Joel Coehoorn

1
Sono andato alla mia finestra di dialogo Opzioni di debug e ho scelto "Reindirizza tutto il testo della finestra di output nella finestra immediata" per fare in modo che l'output di traccia vada alla finestra immediata in modo che non si confonda tutto con la merda di debug.
Gabe

2

È ora di controllare le ultime versioni per Visual Studio, gente. La soluzione più suggerita che non ha funzionato per alcuni di voi prima potrebbe funzionare ora.

In Visual Studio 2017 ( versione di rilascio 15.4.2 e successive), andando a Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowha funzionato per me.

Poche note: 1. Per vedere la finestra immediata, assicurati di essere in modalità Debug . 2. Ora dovrebbero essere disponibili altri 3 strumenti di debug a tua disposizione, vale a dire Stack di chiamate, Punti di interruzione e Finestra di comando, come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Auguri!


Testato in v15.9.4, non funziona (non per un'applicazione console, almeno).
bta

Hmm. Se puoi condividere uno screenshot delle tue configurazioni, posso provare a replicare il problema da parte mia. Altrimenti, puoi condividere la tua soluzione se è stata risolta. Le note sulla versione per Visual Studio 15.9.4 sono disponibili su docs.microsoft.com/en-us/visualstudio/releasenotes/… , in cui potresti trovare alcuni suggerimenti utili a seconda del tuo ambiente. Documentazione di Visual Studio 2017 (finestra di output) : docs.microsoft.com/en-us/visualstudio/ide/reference/…
kuzevni

Verifica che il progetto con cui stai testando sia stato creato come "applicazione console", non come "applicazione Windows". Il tuo approccio funziona con un'applicazione Windows, ma non è quello che ha specificato l'OP.
bta

1

Puoi creare un'applicazione wrapper da eseguire invece di eseguire direttamente la tua app reale. L'applicazione wrapper può ascoltare stdout e reindirizzare tutto a Trace. Quindi modifica le impostazioni di esecuzione per avviare il wrapper e passare il percorso all'app reale da eseguire.

Potresti anche fare in modo che il wrapper colleghi automaticamente il debugger al nuovo processo se un debugger è collegato al wrapper.


0

So che questa è solo un'altra risposta, ma ho pensato di scrivere qualcosa per i nuovi sviluppatori Web, che potrebbero confondersi sulla parte "Modifica in un'applicazione Windows", perché penso che per impostazione predefinita un'applicazione MVC in Visual Studio 2013 il valore predefinito è un tipo di output della libreria di classi.

La mia applicazione Web per impostazione predefinita è impostata come un tipo di output di "Libreria di classi". Non devi cambiarlo. Tutto quello che dovevo fare era seguire i suggerimenti di andare su Strumenti> Opzioni> Debug> Reindirizza tutto il testo della finestra di output nella finestra immediata. Ho quindi utilizzato il System.Diagnostics.Tracesuggerimento di Joel Coehoorn sopra.


0

Una soluzione semplice che funziona per me, per lavorare con la capacità della console (ReadKey, String with Format e arg ecc.) E per vedere e salvare l'output:

Scrivo TextWriter che scrive su Consolee in Tracee sostituisce il Console.Outcon esso.

se usi Finestra di dialogo -> Debug -> Controlla "Reindirizza tutto il testo della finestra di output alla finestra immediata" lo ottieni nella finestra immediata e abbastanza pulito.

il mio codice: all'inizio del mio codice:

   Console.SetOut(new TextHelper());

e la classe:

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);

        }

    }

Nota: sovrascrivo solo ciò di cui avevo bisogno, quindi se scrivi altri tipi dovresti sovrascriverne di più


0

per quanto riguarda la System.Diagnostics.Debugproduzione di molta "spazzatura" nella finestra di output: puoi disattivarla facendo clic con il pulsante destro del mouse nella finestra di output. Ad esempio, c'è una voce "Messaggi di caricamento del modulo" che si desidera disabilitare e una voce "Uscita del programma" che si desidera mantenere.


0

Hai tre possibilità per farlo, ma non è banale. L'idea principale di tutti gli IDE è che tutti siano i genitori dei processi figlio (debug). In questo caso, è possibile manipolare con input, output e gestore degli errori standard. Quindi gli IDE avviano applicazioni figlio e reindirizzano nella finestra di output interna. Conosco un'altra possibilità, ma arriverà in futuro

  1. È possibile implementare il proprio motore di debug per Visual Studio. Avvio e debug del controllo del motore di debug per l'applicazione. Esempi per questo è possibile trovare come eseguire questa operazione su docs.microsoft.com ( motore di debug di Visual Studio )
  2. Reindirizzare l'applicazione del modulo utilizzando la duplicazione del gestore std per c ++ o utilizzare Console.SetOut (TextWriter) per c #. Se è necessario stampare nella finestra di output, è necessario utilizzare Visual Studio extension SDK. Esempio della seconda variante che potresti trovare su Github .
  3. Avvia l'applicazione che utilizza System.Diagnostics.Debug.WriteLine (per la stampa nell'output) e quindi avvierà l'applicazione figlio. All'avvio di un figlio, è necessario reindirizzare lo stdout al genitore con pipe. Potresti trovare un esempio su MSDN. Ma penso che questo non sia il modo migliore.

0

Se è necessario l'output da Console.WriteLine e il testo della finestra di reindirizzamento di tutto l'output nella finestra immediata non funziona ed è necessario conoscere l'output dei test da Integrated Test Explorer, utilizzando NUnit.Framework il nostro problema è già risolto in VS 2017 :

Esempio tratto da C # In Depth di Jon Skeet: Esempio tratto da C # In Depth di Jon Skeet questo produce questo output in Text Explorer: Esplora attività

Quando facciamo clic su Blue Output, sotto Elapsed Time, a destra, e produce questo: Uscita standard

Uscita standard è l'output desiderato, prodotto da Console.WriteLine.

Funziona per la console e per le applicazioni Windows Form in VS 2017, ma solo per l'output generato per Test Explorer al debug o all'esecuzione; comunque, questo è il mio principale bisogno di output Console.WriteLine.


-1

Invece, puoi raccogliere l'output in un risultato del test.

Non è possibile fornire input, ma è possibile fornire facilmente diversi test con diversi argomenti della riga di comando, ciascuno dei quali raccoglie l'output.

Se il tuo obiettivo è il debug, questo è un modo a basso sforzo per offrire uno scenario di debug ripetibile.

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

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

-7

Passaggio 1: fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni, quindi impostare il tipo di output come Applicazione finestra

Passaggio 2: Debug -> Opzioni ...--> Debug (Espandi) -> Generale -> Reindirizza tutto il testo della finestra di output nella finestra immediata


3
Questa risposta è stata data tre volte in precedenza. Non risponde alla domanda posta.
Klay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.