web-dev-qa-db-ja.com

.NETの「StandardIn has been redirected」エラー(C#)

Stdinを使用して簡単なアプリを実行したい。あるプログラムでリストを作成し、別のプログラムで印刷したい。以下を思いつきました。

App2が機能するかどうかはわかりませんが、app1で「StandardIn has been redirected」という例外が発生します。 writeline(foreachステートメント内)。どうすれば目的を達成できますか?

注:UseShellExecuteをtrueとfalseの両方に設定してみました。どちらもこの例外を引き起こします。

        //app1
        {
            var p = new Process();
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.FileName = @"path\bin\Debug\print_out_test.exe";
            foreach(var v in lsStatic){
                p.StandardInput.WriteLine(v);
            }
            p.StandardInput.Close();
        }

    //app 2
    static void Main(string[] args)
    {
        var r = new StreamReader(Console.OpenStandardInput());
        var sz = r.ReadToEnd();
        Console.WriteLine(sz);
    }
24
user34537

新しいプロセスをStart()することはありません。

33
itsme86

リダイレクトを正しく機能させるには、ShellExecuteがfalseに設定されていることを確認する必要があります。

また、ストリームライターを開いて、プロセスを開始し、プロセスが終了するのを待って、プロセスを閉じる必要があります。

これらの行を置き換えてみてください:

        foreach(var v in lsStatic){
            p.StandardInput.WriteLine(v);
        }
        p.StandardInput.Close();

これらと:

p.Start();
using (StreamWriter sr= p.StandardInput)
{
     foreach(var v in lsStatic){
         sr.WriteLine(v);
     }
     sr.Close();
}
// Wait for the write to be completed
p.WaitForExit();
p.Close();
12
competent_tech

プロセスをストリームに書き込む方法の簡単な例を見たい場合は、以下のコードをテンプレートとして使用してください。ニーズに合わせて自由に変更してください。

class MyTestProcess
{
    static void Main()
    {
        Process p = new Process();
        p.StartInfo.UseShellExecute = false ;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;

        p.StartInfo.FileName = @"path\bin\Debug\print_out_test.exe";
        p.StartInfo.CreateNoWindow = true;
        p.Start();

        System.IO.StreamWriter wr = p.StandardInput;
        System.IO.StreamReader rr = p.StandardOutput;

        wr.Write("BlaBlaBla" + "\n");
        Console.WriteLine(rr.ReadToEnd());
        wr.Flush();
    }
}

// forループで作業を追加するように変更

8
MethodMan

から http://msdn.Microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput.aspx

RedirectStandardInputをtrueに設定する場合は、UseShellExecuteをfalseに設定する必要があります。それ以外の場合、StandardInputストリームへの書き込みは例外をスローします。

デフォルトではfalseであると予想されるかもしれませんが、そうではないようです。

1
Chris Shain