2010-09-19 4 views
3

Так довольно простой вопрос. У меня есть C# .dll с целым рядом кода Console.Writeline и вы хотите просмотреть этот вывод в приложении форм, используя эту .dll. Существует ли относительно простой способ привязки вывода консоли к RichEdit (или другому подходящему элементу управления)? В качестве альтернативы, можно ли вставить реальную оболочку консоли в форму? Я нашел несколько несколько похожих вопросов, но в большинстве случаев люди хотели иметь возможность получать консольный ввод, который для меня не нужен.Bind Console Output to RichEdit

Спасибо.

ответ

4

Вы можете использовать Console.SetOut() для перенаправления вывода. Вот образец, демонстрирующий подход. Отбросьте RichTextBox и кнопку в форме.

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); 
    } 
} 

Я предполагаю, что это будет не очень быстро, но выглядело нормально, когда я попробовал. Вы можете оптимизировать, переопределив больше методов.

+0

Спасибо за ответ, кажется, работает достаточно хорошо. И мне не нужен был особенно эффективный метод. – DeusAduro

+0

Спасибо @Hans Passant, я добавил ваше решение к вопросу начинающих здесь: http://stackoverflow.com/questions/22028888/visual-studio-2013-how-do-i-view-output-in-the-console/36645367 # 36645367 – Goodies

3

ИМО, было бы лучше, чтобы реорганизовать существующий код, заменив существующий Console.WriteLine к некоторому центральному метода в коде, а затем Repoint этот метод, по-видимому, поставляя другой 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 (проще и меньше hacky re статическое поле), просто передайте TextWriter в свой существующий код и напишите на это?