3

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 リダイレクトを機能させることはできますか?

4

1 に答える 1

1

理由はわかりませんが、ここでユーザーを明示的に指定すると問題が解決します:

proc.UserName = user;
proc.Domain= domain;
proc.Password= password;

あまりエレガントではありませんが、私にとってはうまくいき、誰かを助けるかもしれません。

于 2013-10-14T12:02:11.217 に答える