31

この質問を見つけましたが、知りたいことは異なります-Console.WriteLineからの出力は、デバッグ時にどこにでも行きますか?出力ウィンドウに移動するには、Debug.WriteLine()または他のメソッドが必要ですが、標準のConsole.WriteLine()はどこに移動しますか?

編集 デバッグ時に、黒いコンソールウィンドウ/テストログが表示されないので、本当の問題は、デバッグ中にこの出力にアクセス/表示するにはどうすればよいですか?

4

10 に答える 10

21

コンソールは、その出力を任意のテキストライターにリダイレクトできます。Diagnostics.Debug に書き込むテキストライターを実装すれば、準備は完了です。

これは、デバッガーに書き込むテキストライターです。

using System.Diagnostics;
using System.IO;
using System.Text;

namespace TestConsole
{
    public class DebugTextWriter : TextWriter
    {
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void Write(string value)
        {
            Debug.Write(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            Debug.WriteLine(value);
        }
    }
}

Diagnostics.Debug を使用するため、コンパイラの設定に従って、出力を書き込むかどうかを決定します。この出力は、Sysinternals DebugView でも確認できます。

使用方法は次のとおりです。

using System;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetOut(new DebugTextWriter());
            Console.WriteLine("This text goes to the Visual Studio output window.");
        }
    }
}

リリース モードでコンパイルしているときに Sysinternals DebugView で出力を表示する場合は、OutputDebugString API に書き込む TextWriter を使用できます。次のようになります。

using System.IO;
using System.Runtime.InteropServices;
using System.Text;

namespace TestConsole
{
    public class OutputDebugStringTextWriter : TextWriter
    {
        [DllImport("kernel32.dll")]
        static extern void OutputDebugString(string lpOutputString);

        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }

        //Required
        public override void Write(char value)
        {
            OutputDebugString(value.ToString());
        }

        //Added for efficiency
        public override void Write(string value)
        {
            OutputDebugString(value);
        }

        //Added for efficiency
        public override void WriteLine(string value)
        {
            OutputDebugString(value);
        }
    }
}
于 2011-04-07T07:58:09.640 に答える
10

NullStream、「バッキングストアのないストリーム」として定義されます。すべてのメソッドは何もしないか、何も返しません。の内部クラスStreamです。次のコードは、Microsoftのソースコードから抜粋したものです。

基本的に、Console書き込みメソッドの1つが最初に呼び出されると、GetStdHandle「標準出力」のためにWindowsAPI関数が呼び出されます。ハンドルが返されない場合は、NullStreamが作成されて使用されます。

サミュエルの答えは正しく、一般的な情報を提供します。プロジェクトの種類に関係なく、コンソール出力を実際にリダイレクトするにConsole.SetOut(New System.IO.StreamWriter("C:\ConsoleOutput.txt"))は、簡単な例であるを使用します。

コンソール、デバッグ、およびファイルへのトレースの指示

あなたの質問に直接答えるため。ConsoleTraceListenerおよびを使用して、 StreamWriter3つの出力すべてをファイルに送信します。私は開発のためだけに以下を使用します。

    Dim oLogFile As New System.IO.StreamWriter("C:\ConsoleOutput.txt")
    oLogFile.AutoFlush = True 'so we do not have to worry about flushing before application exit

    Console.SetOut(oLogFile)

    'note, writing to debug and trace causes output on console, so you will get double output in log file
    Dim oListener As New ConsoleTraceListener
    Debug.Listeners.Add(oListener)
    Trace.Listeners.Add(oListener)

NullStream

[Serializable]
private sealed class NullStream : Stream {
    internal NullStream() { }

    public override bool CanRead {
        get { return true; }
    }

    public override bool CanWrite {
        get { return true; }
    }

    public override bool CanSeek {
        get { return true; }
    }

    public override long Length {
        get { return 0; }
    }

    public override long Position {
        get { return 0; }
        set { }
    }

    // No need to override Close

    public override void Flush() {
    }

    public override int Read([In, Out] byte[] buffer, int offset, int count) {
        return 0;
    }

    public override int ReadByte() {
        return -1;
    }

    public override void Write(byte[] buffer, int offset, int count) {
    }

    public override void WriteByte(byte value) {
    }

    public override long Seek(long offset, SeekOrigin origin) {
        return 0;
    }

    public override void SetLength(long length) {
    }
} 
于 2010-01-16T01:49:10.733 に答える
3

Debug と Release は、コンソール ウィンドウを表示するかどうかを制御しません。これは、プロジェクトの出力タイプによって制御されます。(プロパティ -> アプリケーション -> 出力タイプ)。コンソール アプリケーションは、ウィンドウから System.Console の Error、In、および Out ストリームへの入力を視覚化して受け取るコンソール ウィンドウを取得します。

System.Console クラスは、見えなくてもストリームと対話するためのいくつかのプロパティとメソッドを公開します。特に重要なのは、Error、In、Out、SetError()、SetIn()、SetOut()、および Read メソッドと Write メソッドです。

于 2008-10-30T15:15:55.060 に答える
1

Visual Studio は、名前付きパイプにリダイレクトさ/target:winexeれた stdin/stdout/stderr を使用して Windows プログラム ( ) を起動します。各パイプのもう一方の端は VS デバッガーによって所有され、stderr/stdout で読み取られたものはすべてデバッグ出力ウィンドウに表示されます。したがって、VS デバッグ出力に自動的に表示されます。これは、すでに開始されているプロセスにアタッチした場合には発生しないことに注意してください(リダイレクトのトリックはプロセスの起動時にしか実行できないため)。Console.Write

コンソール プログラム ( /target:exe) を起動すると、このリダイレクトは発生しないため、Console.Writeは実際のコンソール (またはstdoutがリダイレクトされる場所) に移動します。

この動作を文書化するものは何も見つかりませんでした。これは、VS がアプリを起動してデバッグする方法を調査した結果にすぎません。

于 2017-11-15T12:01:46.367 に答える
1

私は実際にこれでジェームスを2番目にします。

http://www.csharp411.com/console-output-from-winforms-application

全体的に詳細に説明しています(ただし、出力をファイルに送信するだけで十分な場合は、amissico の方法を簡単に使用できます)。彼らが説明する方法のほとんどは、 http://dslweb.nwnexus.com/~ast/dload/guicon.htmで説明されている方法を模倣しています。

前述のように、プロジェクトを「コンソール」プロジェクトに変更すると、同様の効果があります。乾杯!

于 2011-03-13T04:59:34.710 に答える
0

コンソール (標準出力) またはコンソールが設定されているストリームに出力されます。

于 2008-10-30T14:44:33.767 に答える
-1

WinForms アプリでもコンソール ウィンドウを作成できますが、Win32 メソッドを直接呼び出すには P/Invoke を使用する必要があります。http://pinvoke.net/default.aspx/kernel32/AllocConsole.htmlを参照してください。

于 2008-10-30T15:08:39.677 に答える
-4

Console.writeline() は、コンソール ウィンドウ (黒いコマンド/DOS プロンプト) に移動します。

于 2008-10-30T14:44:59.397 に答える