"StandardIn n'a pas été redirigé" erreur in.NET (C#)

je veux faire une application simple en utilisant stdin. Je veux créer une liste dans un programme et de l'imprimer dans un autre. Je suis venu avec la ci-dessous.

Je n'ai aucune idée si app2 fonctionne cependant dans app1 j'obtiens l'exception "StandardIn N'a pas été redirigé."sur writeline (à l'intérieur de l'instruction foreach). Comment puis-je faire ce que j'ai l'intention de faire?

NOTE: j'ai essayé de définir UseShellExecute à la fois vrai et faux. Les deux sont à l'origine de cette exception.

        //app1
        {
            var p = new Process();
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.FileName = @"pathbinDebugprint_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);
    }
16
demandé sur JohnFx 2012-01-12 01:26:49

4 réponses

vous ne commencez jamais () le nouveau processus.

24
répondu itsme86 2012-01-11 21:32:09

vous devez vous assurer que ShellExecute est défini à false pour que la redirection fonctionne correctement.

vous devriez également ouvrir un streamwriter dessus, démarrer le processus, attendre que le processus se termine, et fermer le processus.

Essayez de remplacer ces lignes:

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

avec:

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();
10
répondu competent_tech 2012-01-11 21:36:30

si vous souhaitez voir un exemple simple de comment écrire votre processus à un Flux d'utiliser ce code ci-dessous comme Modèle se sentir libre de le modifier pour l'adapter à vos besoins..

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();
    }
}

//Modification pour ajouter votre travail avec votre boucle for

7
répondu MethodMan 2017-11-29 00:27:19

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

vous devez définir UseShellExecute à false si vous voulez définir RedirectStandardInput à true. Dans le cas contraire, l'écriture sur le flux StandardInput fait exception.

On pourrait s'attendre à false par défaut, qui ne semble pas être le cas.

1
répondu Chris Shain 2012-01-11 21:29:15