子コンソール アプリからの出力をキャッチしようとしています。
- 親がコンソール アプリの場合、すべてが機能します。
- 親が Windows アプリの
Console.ReadKey()
場合、stdInput がリダイレクトされたときに readKey を実行する方法がないという例外が発生し、子は実行に失敗します。ただし、入力をリダイレクトしていません (出力のみ)。
ここで何が欠けていますか?
子コード (プロジェクトをコンソール アプリに設定):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ChildProcess
{
internal class Program
{
private static void Main(string[] args)
{
char key = Console.ReadKey().KeyChar;
Console.Out.WriteLine("stdout");
Console.Error.WriteLine("stderr");
}
}
}
親アプリ コード: (プロジェクトを Windows アプリに設定)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RedirectProcessOutput
{
internal class Program
{
private static void Main(string[] args)
{
string fileName = @"ChildPRocess.exe";
string arg = "i";
string processOutput = "?";
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = false;
p.StartInfo.FileName = fileName;
p.StartInfo.Arguments = arg;
p.Start();
processOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Console.WriteLine("The child process output is:" + processOutput);
}
}
}
子には独自のコンソールが必要であり、そのための入力をリダイレクトしていないため、親がウィンドウアプリであってもアプリケーションがクラッシュすることなく実行されることを期待していました。ところで-すべてが次の場合に機能します。
- 子が「ReadKey」を実行していない、または
- 親は stdout をまったくリダイレクトしていません