bet*_*zan 8 .net c# io process io-redirection
我在C#中编写一个应用程序,在某些时候使用带有异步IO重定向的Process类将应用程序作为子进程启动,如下所示:
private void AppLaunch_Click(object sender, RoutedEventArgs e)
{
Process appProcess = new Process();
appProcess.StartInfo.FileName = currAppPath;
appProcess.StartInfo.Arguments = "";
//Setup Redirection
appProcess.StartInfo.UseShellExecute = false;
appProcess.StartInfo.ErrorDialog = false;
appProcess.StartInfo.RedirectStandardError = true;
appProcess.EnableRaisingEvents = true;
// Attach Output Handler
appProcess.ErrorDataReceived += appProc_DataReceived;
appProcess.Exited += appProc_Exited;
buildLogConsoleOutputTxtbox.AppendText(currAppPath + "\n");
appProcess.Start();
appProcess.BeginErrorReadLine();
}
private void appProc_DataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
this.appendLogText(e.Data);
}
}
private void appProc_Exited(object sender, System.EventArgs e)
{
Process proc = (Process)sender;
// Wait a short while to allow all console output to be processed and appended
Thread.Sleep(40);
this.appendLogText("\n>>");
proc.Close();
}
private void appendLogText(string logText)
{
// Use a delegate if called from a different thread,
// else just append the text directly
if (buildLogConsoleOutputTxtbox.Dispatcher.CheckAccess())
{
// Thread owns the TextBox
buildLogConsoleOutputTxtbox.AppendText(logText + Environment.NewLine);
}
else
{
//Invocation Required
appendLogCallBack appendLog = new appendLogCallBack(buildLogConsoleOutputTxtbox.AppendText);
buildlogScrollEnd buildlogscrl = new buildlogScrollEnd(buildLogConsoleOutputTxtbox.ScrollToEnd);
buildLogConsoleOutputTxtbox.Dispatcher.BeginInvoke(appendLog, new object[] { logText + Environment.NewLine });
buildLogConsoleOutputTxtbox.Dispatcher.BeginInvoke(buildlogscrl);
}
Run Code Online (Sandbox Code Playgroud)
这段代码的问题在于,当我确实将stderr正确地重定向到我的文本框时,这个重定向似乎隐藏了进程' stdout输出,我不想重定向!
如果我重定向stdout,我可以看到它正确重定向,但是不可能只重定向stderr而不是stdout?我已经四处搜索并搜索了这个主题,但所有的讨论似乎都是关于重定向stdout ...例如:如何异步读取标准输出流和标准错误流一次
对此我有任何帮助,我将不胜感激!
这是不可能的 - 输出和错误句柄同时重定向。MSDN 文章STARTUPINFO描述了STARTF_USESTDHANDLES标志。
但有一个好消息。保留子进程输出仍然是可能的。你只需要:
所以在进程开始调用之后
[DllImport("Kernel32.dll", SetLastError = true) ]
static extern uint AttachConsole(int pid);
Run Code Online (Sandbox Code Playgroud)
然后在DataReceived处理程序中使用简单的 Console.WriteLine 。