控制台可以将其输出重定向到任何文本编写器。如果您实现了一个编写到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.");
}
}
}
如果您想在Release模式下编译时查看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
写入方法时,第一次会调用Windows API函数GetStdHandle
以获取“标准输出”。如果没有返回处理,就创建并使用NullStream
。Console.SetOut(New System.IO.StreamWriter("C:\ConsoleOutput.txt"))
,这是一个简单的示例。ConsoleTraceListener
和StreamWriter
将所有三个输出指向文件。我仅在开发中使用以下内容。 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) {
}
}
对我来说最好的解决方案是将Console.WriteLine()更改为System.Diagnostics.Debug.WriteLine()。例如:
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
System.Diagnostics.Debug.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
}
}
using System.Diagnostics;
。然后,使用Debug而不是Console。Debug.WriteLine("Hello World");
/target:winexe
)时,将stdin/stdout/stderr重定向到命名管道。每个管道的另一端由VS调试器拥有,stderr/stdout上读取的任何内容都会显示在“调试输出”窗口中。因此,Console.Write
自动出现在VS调试输出中。请注意,如果你附加到已经启动的进程上,这种情况不会发生(因为重定向技巧只能在进程启动时完成)。/target:exe
)时,不会发生此重定向,因此Console.Write
会输出到实际控制台(或者stdout
被重定向到的地方)。我实际上也同意詹姆斯的观点。
http://www.csharp411.com/console-output-from-winforms-application
详细描述(如果将输出定向到文件中则可以轻松使用amissico的方法)。他们描述的大多数方法都是模仿 http://dslweb.nwnexus.com/~ast/dload/guicon.htm 中所述的方法。
将您的项目更改为“控制台”项目将产生类似的效果,如上所述。 干杯!
它输出到控制台(标准输出)或者控制台所设置的流中。
如已在OP的问题中评论:
无需编写额外代码
在Visual Studio最上方的菜单中选择
调试 > 窗口 > 输出
输出窗口仅在调试模式下可见,它将显示所有例如
Console.WriteLine("Debug MyVariable: " + MyVariable)
当您到达它们时。
在(选定行的开头的不同颜色的空白区域)行号之前设置断点,调试(F5),然后逐行步进代码(F11),直到您找到问题所在。
Console.WriteLine("Debug MyVariable: " + MyVariable)
当你到达它们时。在此之前设置断点,进行调试,然后使用 F11 逐行步进代码。 - s3c