コンソールをapp.configのVisual Studioデバッグ出力ウィンドウにリダイレクトします

StackOverflow https://stackoverflow.com/questions/1407974

  •  05-07-2019
  •  | 
  •  

質問

Console.WriteLine()コマンドを" Output"に表示させたい Debug.WriteLine()ステートメントを含むウィンドウ。私は一度これを行う方法を考え出したと思いますが、Googleでもう一度それを行う方法を覚えていない/見つけることができません。 app.config ファイルでこれを実行できたことを覚えているようです。

コンソールの出力に表示するコンソールおよびデバッグステートメントを取得する方法に関する多くの指示を見つけましたが、「出力」に表示させる方法はありません。ウィンドウ。

それは可能ですか?

役に立ちましたか?

解決

基本的に、最も単純なソリューションは次のようになります。

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

そして、この行をプログラムの初期化に追加する必要があります:

Console.SetOut(new ToDebugWriter());

他のヒント

@Avramの答えは、彼のコードの単一のオーバーロードがlog4netのオーバーロードではなかったことを除いて、私にとってはうまくいきました。 ConsoleAppender は私のシステムで使用していました。 (私は Console.SetOut に興味があるので、log4netの ConsoleAppender はVisual Studioの「デバッグ」出力ペインに出力します。) StringWriter string object char [] の Write および WriteLine メソッド>など。これらの1つ以上が ConsoleAppender Console を介して呼び出していたという前提で。

これは成功し、log4netのログが「デバッグ」に表示されるようになりました。ペイン。

同様の目標を持つ人のために、以下のコードを含めています。 (完全に安全にするために、残りの StringWriter.Write および .WriteLine メソッドをオーバーライドできます。) base の呼び出しを削除しました。それらは不要であるように見え、 StringWriter 内に大きなバッファを構築するだけだと思います(通常、そのクラスの .ToString()を介してアクセスされます。)

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

出力ウィンドウのストリームを取得できる場合は、 Console.SetOut()にリダイレクトします。ただし、このアプローチは可能ではないようです。

System.Debug はすべての< href = "http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.aspx" rel = "nofollow noreferrer"> TraceListener の TraceListenerCollection 。最初に登録されているTraceListenerは1つだけで、これは DefaultTraceListener 。ストリームオブジェクトを使用せず、代わりに出力にネイティブメソッドを使用します。

Visual Studio APIを使用するアプローチがおそらく方法です。

scroll top