Rediriger console.writeline à partir d’une application Windows vers une chaîne

J’ai une dll externe écrite en C # et j’ai étudié dans la documentation des assemblages qu’elle écrit ses messages de débogage sur la console à l’aide de Console.WriteLine .

cette DLL écrit sur la console lors de mon interaction avec l’interface utilisateur de l’application. Je ne fais donc pas d’appels de DLL directement, mais je capturerais toutes les sorties de la console. .

Je voudrais redirect toute la sortie à une variable de chaîne.

J’ai essayé Console.SetOut , mais son utilisation pour redirect en chaîne n’est pas facile.

Comme il semble que vous souhaitiez capturer la sortie de la console en temps réel, j’ai pensé que vous pourriez créer votre propre implémentation TextWriter qui déclenche un événement chaque fois qu’un événement Write ou WriteLine se produit sur la Console .

L’auteur ressemble à ceci:

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

S’il s’agit d’une application WinForm, vous pouvez configurer le rédacteur et utiliser ses événements dans Program.cs comme ceci:

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

Cela revient essentiellement à ce qui suit:

 var originalConsoleOut = Console.Out; // preserve the original stream using(var writer = new SsortingngWriter()) { 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 mySsortingng = writer.GetSsortingngBuilder().ToSsortingng(); } Console.SetOut(originalConsoleOut); // restore Console.Out 

Donc, dans votre cas, vous devez configurer ceci avant de passer des appels à votre DLL tierce.

Ou vous pouvez envelopper dans une méthode d’assistance qui prend un code comme argument, l’exécuter et renvoyer la chaîne qui a été imprimée. Remarquez comment nous gérons les exceptions avec grâce.

 public ssortingng RunCodeReturnConsoleOut(Action code) { ssortingng result; var originalConsoleOut = Console.Out; try { using (var writer = new SsortingngWriter()) { Console.SetOut(writer); code(); writer.Flush(); result = writer.GetSsortingngBuilder().ToSsortingng(); } return result; } finally { Console.SetOut(originalConsoleOut); } } 

Vous pouvez également appeler SetOut avec Console.OpenStandardOutput, cela restaurera le stream de sortie d’origine:

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