8

以下に示すように、非同期IOリダイレクトを使用してProcessクラスを使用して、ある時点で子プロセスとしてアプリケーションを開始するC#でアプリケーションを作成しています。

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

このコードの問題は、stderrがテキスト ボックスに適切にリダイレクトされる一方で、リダイレクトしたくないプロセスのstdout出力が隠されているように見えることです。

stdout をリダイレクトすると、正しくリダイレ​​クトされていることがわかりますが、stdout ではなく stderr だけをリダイレクトすることは不可能ですか? 私はこのトピックについて見回してグーグルで検索しましたが、すべての議論はstdoutのリダイレクトに関するものであるようです...次のように:標準出力ストリームと標準エラーストリームを一度に非同期に読み取る方法

これに関して何か助けていただければ幸いです!

4

1 に答える 1

2

これはそのままでは不可能です。出力ハンドルとエラー ハンドルが同時にリダイレクトされます。MSDN の記事STARTUPINFO では、フラグについて説明してSTARTF_USESTDHANDLESいます。

しかし、良いニュースがあります。子プロセスの出力を保持することは引き続き可能です。あなたはただしなければなりません:

  • 子プロセスの出力をリダイレクトする
  • 子プロセスのコンソールにアタッチ
  • 子プロセスの出力をコンソールに書き戻す

したがって、プロセス開始直後の呼び出し

[DllImport("Kernel32.dll", SetLastError = true) ]
static extern uint AttachConsole(int pid);

DataReceived次に、ハンドラーで単純な Console.WriteLine を使用します。

于 2012-10-16T21:49:07.430 に答える