Ответ 1
Вы никогда не запускаете() новый процесс.
Я хочу сделать простое приложение с помощью stdin. Я хочу создать список в одной программе и напечатать его в другом. Я придумал ниже.
Я понятия не имею, работает ли app2, однако, в app1 я получаю исключение "StandardIn не перенаправлен". в строке (внутри инструкции 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);
}
Вы никогда не запускаете() новый процесс.
Вы должны убедиться, что для параметра переназначения 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();
если вы хотите увидеть простой пример того, как писать свой процесс в Stream, используйте этот код ниже в качестве шаблона, чтобы изменить его в соответствии с вашими потребностями.
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
Вы должны установить UseShellExecute в значение false, если вы хотите установить для RedirectStandardInput значение true. В противном случае запись в поток StandardInput генерирует исключение.
По умолчанию можно ожидать, что он будет ложным, что, похоже, не так.