子プロセスの標準入力のリダイレクト標準出力・標準エラーのリダイレクトは同時に組み合わせることもできます。 これにより、子プロセスの標準入力に書き込み、子プロセスで何らかの処理を行った結果を標準出力から読み込む、さらに子プロセスの標準エラー出力も読み込む、といったことができます。

parent.exe:子プロセスの標準入出力へ読み書きする
using System;
using System.Diagnostics;

class Sample {
  static void Main()
  {
    // 子プロセスchild.exeの起動オプション
    var psi = new ProcessStartInfo("child.exe") {
      // シェルを使用せず子プロセスを起動する
      // (リダイレクトするために必要)
      // ⚠.NET Core/.NET 5以降ではデフォルトでfalseとなっている
      UseShellExecute = false,

      // 起動した子プロセスの標準入出力をリダイレクトする
      RedirectStandardInput = true,
      RedirectStandardOutput = true,
    };

    // 子プロセスを起動する
    using (var child = Process.Start(psi)) {
      string output = null;

      // リダイレクトされた子プロセスの標準入出力を取得する
      using (var stdin = child.StandardInput)
      using (var stdout = child.StandardOutput) {
        // 子プロセスの標準入力に書き込む
        stdin.WriteLine("hello, world!");

        // 子プロセスの標準出力から読み込む
        output = stdout.ReadLine();
      } // 子プロセスの標準入出力を閉じて読み書きを終了する

      // 子プロセスの終了を待機する
      child.WaitForExit();

      // 読み込んだテキストを表示する
      Console.WriteLine($"output: \"{output}\"");
    }
  }
}
child.exe:標準入力から読み込み標準出力へ書き込む
using System;

class Sample {
  static void Main()
  {
    // 標準入力から読み込む
    var line = Console.ReadLine();

    // 標準出力へ書き込む
    Console.WriteLine(line.ToUpper()); // 入力を大文字化して出力
  }
}
実行結果
>parent.exe
output: "HELLO, WORLD!"

さらに、自プロセスの標準ストリームの入出力先を子プロセスの標準ストリームへリダイレクトすることにより、子プロセスの標準ストリームとパイプすることもできます。