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);
}
新しいプロセスをStart()することはありません。
リダイレクトを正しく機能させるには、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();
プロセスをストリームに書き込む方法の簡単な例を見たい場合は、以下のコードをテンプレートとして使用してください。ニーズに合わせて自由に変更してください。
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ループで作業を追加するように変更
RedirectStandardInputをtrueに設定する場合は、UseShellExecuteをfalseに設定する必要があります。それ以外の場合、StandardInputストリームへの書き込みは例外をスローします。
デフォルトではfalseであると予想されるかもしれませんが、そうではないようです。