この質問を見つけましたが、知りたいことは異なります-Console.WriteLineからの出力は、デバッグ時にどこにでも行きますか?出力ウィンドウに移動するには、Debug.WriteLine()または他のメソッドが必要ですが、標準のConsole.WriteLine()はどこに移動しますか?
編集 デバッグ時に、黒いコンソールウィンドウ/テストログが表示されないので、本当の問題は、デバッグ中にこの出力にアクセス/表示するにはどうすればよいですか?
コンソールは、その出力を任意のテキストライターにリダイレクトできます。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);
}
}
}
NullStream
、「バッキングストアのないストリーム」として定義されます。すべてのメソッドは何もしないか、何も返しません。の内部クラスStream
です。次のコードは、Microsoftのソースコードから抜粋したものです。
基本的に、Console
書き込みメソッドの1つが最初に呼び出されると、GetStdHandle
「標準出力」のためにWindowsAPI関数が呼び出されます。ハンドルが返されない場合は、NullStream
が作成されて使用されます。
サミュエルの答えは正しく、一般的な情報を提供します。プロジェクトの種類に関係なく、コンソール出力を実際にリダイレクトするにConsole.SetOut(New System.IO.StreamWriter("C:\ConsoleOutput.txt"))
は、簡単な例であるを使用します。
あなたの質問に直接答えるため。ConsoleTraceListener
およびを使用して、 StreamWriter
3つの出力すべてをファイルに送信します。私は開発のためだけに以下を使用します。
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)
[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) {
}
}
Debug と Release は、コンソール ウィンドウを表示するかどうかを制御しません。これは、プロジェクトの出力タイプによって制御されます。(プロパティ -> アプリケーション -> 出力タイプ)。コンソール アプリケーションは、ウィンドウから System.Console の Error、In、および Out ストリームへの入力を視覚化して受け取るコンソール ウィンドウを取得します。
System.Console クラスは、見えなくてもストリームと対話するためのいくつかのプロパティとメソッドを公開します。特に重要なのは、Error、In、Out、SetError()、SetIn()、SetOut()、および Read メソッドと Write メソッドです。
Visual Studio は、名前付きパイプにリダイレクトさ/target:winexe
れた stdin/stdout/stderr を使用して Windows プログラム ( ) を起動します。各パイプのもう一方の端は VS デバッガーによって所有され、stderr/stdout で読み取られたものはすべてデバッグ出力ウィンドウに表示されます。したがって、VS デバッグ出力に自動的に表示されます。これは、すでに開始されているプロセスにアタッチした場合には発生しないことに注意してください(リダイレクトのトリックはプロセスの起動時にしか実行できないため)。Console.Write
コンソール プログラム ( /target:exe
) を起動すると、このリダイレクトは発生しないため、Console.Write
は実際のコンソール (またはstdout
がリダイレクトされる場所) に移動します。
この動作を文書化するものは何も見つかりませんでした。これは、VS がアプリを起動してデバッグする方法を調査した結果にすぎません。
私は実際にこれでジェームスを2番目にします。
http://www.csharp411.com/console-output-from-winforms-application
全体的に詳細に説明しています(ただし、出力をファイルに送信するだけで十分な場合は、amissico の方法を簡単に使用できます)。彼らが説明する方法のほとんどは、 http://dslweb.nwnexus.com/~ast/dload/guicon.htmで説明されている方法を模倣しています。
前述のように、プロジェクトを「コンソール」プロジェクトに変更すると、同様の効果があります。乾杯!
コンソール (標準出力) またはコンソールが設定されているストリームに出力されます。
WinForms アプリでもコンソール ウィンドウを作成できますが、Win32 メソッドを直接呼び出すには P/Invoke を使用する必要があります。http://pinvoke.net/default.aspx/kernel32/AllocConsole.htmlを参照してください。
Console.writeline() は、コンソール ウィンドウ (黒いコマンド/DOS プロンプト) に移動します。