2012-01-11 10 views
14

में त्रुटि मैं stdin का उपयोग करके एक साधारण ऐप करना चाहता हूं। मैं एक कार्यक्रम में एक सूची बनाना चाहता हूं और इसे दूसरे में प्रिंट करना चाहता हूं। मैं नीचे के साथ आया था।"मानक में रीडायरेक्ट नहीं किया गया है" .NET (सी #)

मुझे नहीं पता कि ऐप 2 ऐप 1 में हालांकि काम करता है तो मुझे अपवाद मिलता है "मानकइन को रीडायरेक्ट नहीं किया गया है।" लेखन रेखा पर (foreach स्टेटमेंट के अंदर)। मैं क्या कर सकता हूं जो मैं चाहता हूं?

नोट: मैंने TrueShellExecute को सही और गलत दोनों पर सेट करने का प्रयास किया। दोनों इस अपवाद का कारण बनते हैं।

 //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); 
    } 
+1

क्या आप पी = प्रक्रिया.स्टार्ट (v) करने की उम्मीद कर रहे हैं; उदाहरण के लिए..?? पी.यूसेशेलएक्सक्यूट = झूठी भी सेट करें; – MethodMan

उत्तर

23

आपने नई प्रक्रिया शुरू नहीं की है()।

+3

ओह हे ओह वाह हाँ, जिसने इसे ठीक कर दिया। –

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

आप सत्य पर RedirectStandardInput स्थापित करने के लिए चाहते हैं तो आप गलत पर UseShellExecute सेट करना होगा

। अन्यथा, मानक इनपुट स्ट्रीम को लिखना अपवाद फेंकता है।

कोई भी डिफ़ॉल्ट रूप से गलत होने की उम्मीद कर सकता है, ऐसा लगता है कि ऐसा नहीं लगता है।

+1

मैंने ऐसा किया था। समस्या शुरू हो रही थी() –

10

आपको यह सुनिश्चित करना होगा कि पुनर्निर्देशन सही तरीके से काम करने के लिए ShellExecute को गलत पर सेट किया गया हो।

आपको उस पर एक स्ट्रीमराइटर भी खोलना चाहिए, प्रक्रिया शुरू करना चाहिए, बाहर निकलने की प्रक्रिया की प्रतीक्षा करें, और प्रक्रिया को बंद करें।

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

यदि आप कैसे अपने प्रक्रिया एक स्ट्रीम उपयोग के लिए इस कोड के नीचे एक के रूप में लिखने के लिए एक सरल उदाहरण देखना चाहेंगे टेम्पलेट अपनी जरूरतों को पूरा करने के लिए इसे बदलने के लिए स्वतंत्र महसूस करता है ..

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

// अपना काम बुद्धि जोड़ने के लिए बदलें एच लूप के लिए

संबंधित मुद्दे