Redirige console.writeline de la aplicación de Windows a una cadena

Tengo un dll externo escrito en C # y estudié a partir de la documentación de ensamblajes que escribe sus mensajes de depuración en Console usando Console.WriteLine .

este archivo DLL se escribe en la consola durante mi interacción con la interfaz de usuario de la aplicación, por lo que no realizo llamadas DLL directamente, pero capturaría todos los resultados de la consola, así que creo que tengo que inicializar en la carga del formulario, luego obtengo ese texto capturado más tarde .

Me gustaría redirigir todo el resultado a una variable de cadena.

Intenté Console.SetOut , pero su uso para redirigir a la secuencia no es fácil.

Como parece que desea capturar la salida de la consola en tiempo real, me di cuenta de que podría crear su propia implementación de TextWriter que active un evento cada vez que ocurra una Write o WriteLine en la Console .

El escritor se ve así:

  public class ConsoleWriterEventArgs : EventArgs { public string Value { get; private set; } public ConsoleWriterEventArgs(string value) { Value = value; } } public class ConsoleWriter : TextWriter { public override Encoding Encoding { get { return Encoding.UTF8; } } public override void Write(string value) { if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value)); base.Write(value); } public override void WriteLine(string value) { if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value)); base.WriteLine(value); } public event EventHandler WriteEvent; public event EventHandler WriteLineEvent; } 

Si se trata de una aplicación WinForm, puede configurar el escritor y consumir sus eventos en Program.cs de esta manera:

  ///  /// The main entry point for the application. ///  [STAThread] static void Main() { using (var consoleWriter = new ConsoleWriter()) { consoleWriter.WriteEvent += consoleWriter_WriteEvent; consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent; Console.SetOut(consoleWriter); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } static void consoleWriter_WriteLineEvent(object sender, Program.ConsoleWriterEventArgs e) { MessageBox.Show(e.Value, "WriteLine"); } static void consoleWriter_WriteEvent(object sender, Program.ConsoleWriterEventArgs e) { MessageBox.Show(e.Value, "Write"); } 

Básicamente se trata de lo siguiente:

 var originalConsoleOut = Console.Out; // preserve the original stream using(var writer = new StringWriter()) { Console.SetOut(writer); Console.WriteLine("some stuff"); // or make your DLL calls :) writer.Flush(); // when you're done, make sure everything is written out var myString = writer.GetStringBuilder().ToString(); } Console.SetOut(originalConsoleOut); // restre Console.Out 

Entonces, en tu caso, configuraste esto antes de hacer llamadas a tu DLL de terceros.

O puede envolverlo en un método auxiliar que tome algún código como argumento y ejecútelo y devuelve la cadena que se imprimió. Observe cómo manejamos con gracia las excepciones.

 public string RunCodeReturnConsoleOut(Action code) { string result; var originalConsoleOut = Console.Out; try { using (var writer = new StringWriter()) { Console.SetOut(writer); code(); writer.Flush(); result = writer.GetStringBuilder().ToString(); } return result; } finally { Console.SetOut(originalConsoleOut); } } 

También puede llamar a SetOut con Console.OpenStandardOutput, esto restaurará la secuencia de salida original:

 Console.SetOut(new StreamWriter(Console.OpenStandardOutput()));