2012-08-11 12 views
9

Tengo un dll externo escrito en C# y estudié desde la documentación de ensamblajes que escribe sus mensajes de depuración en la consola usando Console.WriteLine.Redirecciona console.writeline desde la aplicación de Windows a una cadena

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 de formulario, luego obtener 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.

+0

¿Qué código usaste cuando se trata de utilizar el método 'SetOut'? –

Respuesta

18

ya que parece que se desea capturar la salida de la consola en tiempo real, me di cuenta de que es posible crear su propia aplicación TextWriter que activa un suceso siempre un Write o WriteLine sucede en el Console.

El escritor se parece a esto:

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<ConsoleWriterEventArgs> WriteEvent; 
     public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent; 
    } 

Si se trata de una aplicación WinForm, se puede configurar el escritor y consumen sus eventos en los Program.cs como este:

/// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [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"); 
    } 
+0

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 debo inicializar en la carga del formulario y luego obtener ese texto capturado luego. – geogeek

+0

¿Es una aplicación WinForms? Cuando está en el flujo del programa, ¿necesita la salida? –

+0

sí, es una aplicación C# winform, necesito capturar la salida de la consola después de un evento GUI. – geogeek

17

Básicamente viene a ser 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); // restore Console.Out 

Así que en su caso lo haces con esto antes de hacer llamadas a su DLL de terceros.

+0

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 debo inicializar en la carga del formulario y luego obtener el texto capturado luego. – geogeek

1

o puede hacer envuélvalo en un método de ayuda que toma algún código como argumento, 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); 
    } 
} 
0

También puede llamar a replantear con Console.OpenStandardOutput, esto va a restaurar el flujo de salida original:

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