Bind Console Output to RichEdit

2020-03-05 02:42发布

问题:

So pretty straightforward question. I have a c# .dll with a whole lot of Console.Writeline code and would like to be able to view that output in a forms application using this .dll. Is there a relatively easy way of binding the console output to a RichEdit (or other suitable control)? Alternatively, can I embed an actual console shell within the form? I have found a few somewhat similar questions but in most cases people wanted to be able to recieve console input, which for me is not necessary.

Thanks.

回答1:

You can use Console.SetOut() to redirect the output. Here's a sample form that demonstrates the approach. Drop a RichTextBox and a button on the form.

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        button1.Click += button1_Click;
        Console.SetOut(new MyLogger(richTextBox1));
    }
    class MyLogger : System.IO.TextWriter {
        private RichTextBox rtb;
        public MyLogger(RichTextBox rtb) { this.rtb = rtb; }
        public override Encoding Encoding { get { return null; } }
        public override void Write(char value) {
            if (value != '\r') rtb.AppendText(new string(value, 1));
        }
    }
    private void button1_Click(object sender, EventArgs e) {
        Console.WriteLine(DateTime.Now);
    }
}

I assume it won't be very fast but looked okay when I tried it. You could optimize by overriding more methods.



回答2:

IMO, it would be better to refactor the existing code, replacing the existing Console.WriteLine to some central method in your code, and then repoint this method, presumably by supplying another TextWriter:

private static TextWriter output = Console.Out;
public static TextWriter Output {
   get {return output;}
   set {output = value ?? Console.Out;}
}
public static void WriteLine(string value) {
    output.WriteLine(value);
}
public static void WriteLine(string format, params string[] args) {
    output.WriteLine(format, args);
}

Or (simpler and less hacky re a static field), simply pass a TextWriter into your existing code and write to that?



标签: c# forms console