将console.writeline从Windows应用程序重定向到字符串
我有一个用C#编写的外部dll,我从程序集文档中研究了它使用Console.WriteLine
将其调试消息写入控制台。
这个DLL在我与应用程序的UI交互时写入控制台,所以我不直接进行DLL调用,但我会捕获所有控制台输出,所以我想我必须在表单加载中初始化,然后在以后获取捕获的文本。
我想将所有输出重定向到字符串变量。
我试过Console.SetOut
,但它用于重定向到字符串并不容易。
由于您似乎希望实时捕获控制台输出,我发现您可能会创建自己的TextWriter
实现,只要在Console
上发生Write
或WriteLine
就会触发事件。
作者看起来像这样:
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,这将恢复原始输出流:
上述就是C#学习教程:将console.writeline从Windows应用程序重定向到字符串分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
Console.SetOut(new StreamWriter(Console.OpenStandardOutput()));
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1007201.html