Domanda

Voglio che i miei comandi Console.WriteLine () compaiano nel mio " Output " finestra con le mie istruzioni Debug.WriteLine () . Penso di aver capito come farlo una volta, ma non riesco a ricordare / trovare su Google come farlo di nuovo. Mi sembra di ricordare di essere stato in grado di farlo nel file app.config .

Trovo molte istruzioni su come far apparire le istruzioni di console e di debug nell'output della Console, ma non su come farle apparire in " Output " finestra.

È possibile?

È stato utile?

Soluzione

Fondamentalmente la soluzione più semplice è simile a questa.

public class ToDebugWriter : StringWriter
{
    public override void WriteLine(string value)
    {
        Debug.WriteLine(value);
        base.WriteLine(value);
    }
}

E devi aggiungere questa linea all'inizializzazione del programma:

Console.SetOut(new ToDebugWriter());

Altri suggerimenti

@ Risposta di Avram ha funzionato per me, tranne per il fatto che il singolo sovraccarico nel suo codice non era quello di log4net ConsoleAppender stava usando sul mio sistema. (Sono interessato a Console.SetOut in modo che ConsoleAppender di log4net venga riprodotto nel riquadro di output "Debug" di Visual Studio. Quindi ho scavalcato tutto il StringWriter Write e WriteLine di code> accettano i metodi string , oggetto , char [] , ecc. presupponendo che uno o più di questi fossero quelli che ConsoleAppender chiamava tramite Console .

Questa operazione ha avuto esito positivo e la registrazione di log4net ora appare nel mio " Debug " riquadro.

Includo il codice seguente a beneficio di chiunque abbia obiettivi simili. (Per essere del tutto sicuri, si potrebbero ignorare i restanti metodi StringWriter.Write e .WriteLine .) Ho rimosso le chiamate a base perché sembrano inutili e penso che creino un grosso buffer all'interno di StringWriter (solitamente accessibile tramite il .ToString () di quella classe))

namespace GeneralLibrary.Logging
{
    using System.Diagnostics;
    using System.IO;

    public class DebugWriter : StringWriter
    {
        public override void Write(string format, object arg0)
        {
            Debug.Write(string.Format(format, arg0));
        }

        public override void Write(string format, object arg0, object arg1)
        {
            Debug.Write(string.Format(format, arg0, arg1));
        }

        public override void Write(string format, object arg0, object arg1, object arg2)
        {
            Debug.Write(string.Format(format, arg0, arg1, arg2));
        }

        public override void Write(string format, params object[] arg)
        {
            Debug.Write(string.Format(format, arg));
        }

        public override void Write(object value)
        {
            Debug.Write(value);
        }

        public override void Write(string value)
        {
            Debug.Write(value);
        }

        public override void Write(char[] buffer)
        {
            Debug.Write(buffer);
        }

        public override void Write(char[] buffer, int index, int count)
        {
            Debug.Write(new string(buffer, index, count));
        }

        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }

        public override void WriteLine(object value)
        {
            Debug.WriteLine(value);
        }

        public override void WriteLine(string format, object arg0)
        {
            Debug.WriteLine(format, arg0);
        }

        public override void WriteLine(string format, object arg0, object arg1)
        {
            Debug.WriteLine(format, arg0, arg1);
        }

        public override void WriteLine(string format, object arg0, object arg1, object arg2)
        {
            Debug.WriteLine(format, arg0, arg1, arg2);
        }

        public override void WriteLine(string format, params object[] arg)
        {
            Debug.WriteLine(format, arg);
        }

        public override void WriteLine(char[] buffer)
        {
            Debug.WriteLine(buffer);
        }

        public override void WriteLine(char[] buffer, int index, int count)
        {
            Debug.WriteLine(new string(buffer, index, count));
        }

        public override void WriteLine()
        {
            Debug.WriteLine(string.Empty);
        }
    }
}

Se riesci a ottenere il flusso per la finestra di output puoi usare Console.SetOut () per reindirizzare ad esso. Tuttavia, questo approccio non sembra essere possibile.

System.Debug restituisce ogni < a href = "http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.aspx" rel = "nofollow noreferrer"> TraceListener nella sua TraceListenerCollection . All'inizio è registrato un solo TraceListener che è DefaultTraceListener . Non utilizza un oggetto stream e utilizza invece metodi nativi per l'output.

Un approccio che utilizza l'API di Visual Studio è probabilmente la strada da percorrere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top