将console.writeline从Windows应用程序重定向到字符串

我有一个用C#编写的外部dll,我从程序集文档中研究了它使用Console.WriteLine将其调试消息写入控制台。

这个DLL在我与应用程序的UI交互时写入控制台,所以我不直接进行DLL调用,但我会捕获所有控制台输出,所以我想我必须在表单加载中初始化,然后在以后获取捕获的文本。

我想将所有输出重定向到字符串变量。

我试过Console.SetOut ,但它用于重定向到字符串并不容易。

由于您似乎希望实时捕获控制台输出,我发现您可能会创建自己的TextWriter实现,只要在Console上发生WriteWriteLine就会触发事件。

作者看起来像这样:

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

如果它是一个WinForm应用程序,您可以设置编写器并在Program.cs中使用它的事件,如下所示:

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

它基本上等于以下内容:

 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 

因此,在您的情况下,您可以在调用第三方DLL之前进行设置。

或者你可以将它包装在一个帮助器方法中,该方法将一些代码作为参数运行并返回打印的字符串。 注意我们如何优雅地处理exception。

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

您还可以使用Console.OpenStandardOutput调用SetOut,这将恢复原始输出流:

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