C# 将控制台输出重定向到winforms列表框

C# 将控制台输出重定向到winforms列表框,c#,.net,winforms,console-redirect,C#,.net,Winforms,Console Redirect,我构建了一个库,它使用Console.WriteLine()转储大部分调试文本 我现在正在Windows窗体应用程序中使用库,并且仍然需要访问控制台输出。(显示在列表/文本框中) 我注意到我可以将控制台外的标准覆盖到TextWriter,但是如何将这些数据输入到显示器中呢 我试着按照 public partial class Form1 : Form { Timer T; MemoryStream mem; StreamWriter writer;

我构建了一个库,它使用Console.WriteLine()转储大部分调试文本

我现在正在Windows窗体应用程序中使用库,并且仍然需要访问控制台输出。(显示在列表/文本框中)

我注意到我可以将控制台外的标准覆盖到TextWriter,但是如何将这些数据输入到显示器中呢

我试着按照

  public partial class Form1 : Form
  {
    Timer T;
    MemoryStream mem;
    StreamWriter writer; 


    public Form1()
    {

        InitializeComponent();
        mem = new MemoryStream(1000);
        writer = new StreamWriter(mem);
        Console.SetOut(writer);

        T = new Timer();
        T.Interval = 250; // yes this probally is to short.
        T.Tick += new EventHandler(T_Tick);
        T.Start();


        Console.WriteLine("output");
        Console.WriteLine("AnotherLine");
    }

    void T_Tick(object sender, EventArgs e)
    {
        string s = Encoding.Default.GetString(mem.ToArray());
        string[] Lines = s.Split(Environment.NewLine.ToCharArray());
        Output.Items.Clear(); // Output is a listbox 
        foreach (string str in Lines)
            Output.Items.Add(str);
    }
}
但是没有用。有什么想法吗

删除不需要的代码

与其尝试“捕获”发送到控制台的文本,不如创建一个新类来处理为您编写输出的问题。然后,这个新类可以写入控制台,以及您希望它去的任何其他地方

如果您使用的是.NET的调试类,只需使用两个侦听器:一个ConsoleTraceListener和一个TextWriterTraceListener

要使现有代码正常工作,请添加:

writer.Flush();

在您的Console.WriteLine()调用之后

另一种可能更干净的方法是使用您自己的TextWriter扩展TextWriter,它可以登录到您希望的任何地方

注意:我没有测试过这个

public class ListBoxWriter : TextWriter
{
    private ListBox list;
    private StringBuilder content = new StringBuilder();

    public ListBoxWriter(ListBox list)
    {
        this.list = list;
    }

    public override void Write(char value)
    {
        base.Write(value);
        content.Append(value);
        if (value == '\n')
        {
            list.Items.Add(content.ToString());
            content = new StringBuilder();
        }
    }

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

如果我找不到解决这个问题的办法,我很可能最终会这样做。但我真的更愿意通过访问控制台来实现这一点(主要是作为一种易于使用的东西),但也作为一种教育性的东西。这是我确信我将来可以找到多种用途的东西,所以现在学习如何使用它将非常方便。我已经忘记了调试类的存在,我可能只是转换位来使用它。在这种情况下,要使代码正常工作,只需添加:writer.Flush();在你的控制台之后。WriteLine()调用。这正是我想要的:D谢谢