System.Diagnostics.Process を使用して、stdin/out/err がリダイレクトされたサード パーティのコンソール アプリケーションとやり取りします (外部プログラムは C++ で記述されており、私には制御できません)。
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.CreateNoWindow = false; // <- if true, stdin writes don't make it through
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
var proc = new Process() { StartInfo = info };
proc.OutputDataReceived += new DataReceivedEventHandler(myOutputHandler);
proc.ErrorDataReceived += new DataReceivedEventHandler(myErrorHandler);
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
後で...
proc.StandardInput.WriteLine("some-short-command");
info.CreateNoWindow = false; の場合、テスト コンソール アプリで問題なく動作します。ただし、info.CreateNoWindow = true; の場合は効果がありません。
どちらの場合も、出力とエラーのリダイレクトは正常に機能します。
上記のコードは、FinalBuilder のカスタム アクションを定義するクラス ライブラリの一部です。説明されている動作は、テスト コンソール アプリケーションから、または FinalBuilder デスクトップ アプリケーション内から実行して確認できます。
興味深いことに、3 番目のコンテキスト (FinalBuilder サーバー) から同じユーザーと環境で実行すると、info.CreateNoWindow が true か false かに関係なく、StandardInput.WriteLine は効果がありません。
何が起こっている?
実行コンテキストに関係なく stdin リダイレクトを機能させることはできますか?