tags:

views:

30

answers:

3

Hello,

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  A: 

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?

Marc Gravell
+1  A: 

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.

Hans Passant
Thanks for the response, seems to work quite well. And I wasn't in need of a particularly efficient method.
DeusAduro
A: 

Have you tried the Decorator pattern ?

Siva Gopal