Ошибка «StandardIn не была перенаправлена» в .NET (C #) - PullRequest
21 голосов
/ 12 января 2012

Я хочу сделать простое приложение, используя 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);
    }

Ответы [ 4 ]

30 голосов
/ 12 января 2012

Вы никогда не запускаете () новый процесс.

10 голосов
/ 12 января 2012

Вы должны убедиться, что для 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();
8 голосов
/ 12 января 2012

, если вы хотите увидеть простой пример того, как записать ваш процесс в поток, используйте этот код ниже в качестве шаблона, не стесняйтесь изменять его в соответствии с вашими потребностями.

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

1 голос
/ 12 января 2012

С http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput.aspx

Вы должны установить для UseShellExecute значение false, если вы хотите установить для RedirectStandardInput значение true. В противном случае запись в поток StandardInput вызывает исключение.

Можно ожидать, что по умолчанию оно будет ложным, но это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...