Главный вопрос заключается в том, имеете ли вы контроль над исходным кодом программы, чей вывод вы хотите зарегистрировать и отобразить?
Если это так, то у вас есть пара вариантов.Вероятно, проще всего было бы «перехватить» поток вывода консоли с помощью составного TextWriter:
public class CompoundWriter:TextWriter
{
public readonly List<TextWriter> Writers = new List<TextWriter>();
public override void WriteLine(string line)
{
if(Writers.Any())
foreach(var writer in Writers)
writer.WriteLine(line);
}
//override other TextWriter methods as necessary
}
...
//When the program starts, get the default Console output stream
var consoleOut = Console.Out;
//Then replace it with a Compound writer set up with a file writer and the normal Console out.
var compoundWriter = new CompoundWriter();
compoundWriter.Writers.Add(consoleOut);
compoundWriter.Writers.Add(new TextWriter("c:\temp\myLogFile.txt");
Console.SetOut(compoundWriter);
//From now on, any calls to Console's Write methods will go to your CompoundWriter,
//which will send them to the console and the file.
Вы также можете использовать прослушиватели Trace для обработки любого вывода, который вы хотите перейти в оба места:
Trace.Listeners.Clear();
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
Trace.Listeners.Add(new TextWriterTraceListener(File.Open("C:\temp\myLogFile.txt");
//replace any call to Console.WriteLine() with Trace.WriteLine()
если у вас нет контроля над исходным кодом консольного приложения, которое вы хотите «ти», и консольное приложение не требует ввода в середине своего выполнения, тогда вы можете использовать именованный канал дляполучить выходные данные приложения и перенаправить его.
var appLocation = @"C:\temp\myApp.exe";
var pipeName = "ConsoleNamedPipe";
using(var namedPipe = new NamedPipeServerStream(pipeName, PipeDirection.In))
{
var info = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = String.Format(@"/C {1} >>\\.\pipe\{0}",
pipeName, appLocation),
WindowStyle = ProcessWindowStyle.Hidden
};
ConsoleProcess = Process.Start(info);
pipe.WaitForConnection();
using (var reader = new StreamReader(pipe))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
Console.WriteLine(line);
myFileWriter.WriteLine(line);
}
}
}
Это очень простой пример;Вы можете обеспечить больше взаимодействия, используя двусторонний канал, но это потребует немного больше кода с вашей стороны.