2009-01-06 11 views
48

मैं एक विंडोज फॉर्म एप्लिकेशन विकसित कर रहा हूं जिसके लिए मुझे एक कार्य करने के लिए एक अलग प्रोग्राम कॉल करने की आवश्यकता है। कार्यक्रम एक कंसोल एप्लिकेशन है और मुझे कंसोल से मानक आउटपुट को अपने प्रोग्राम में टेक्स्टबॉक्स में रीडायरेक्ट करने की आवश्यकता है।अलग प्रोग्राम में टेक्स्टबॉक्स में कंसोल आउटपुट रीडायरेक्ट करें

मुझे अपने आवेदन से प्रोग्राम निष्पादित करने में कोई समस्या नहीं है, लेकिन मुझे नहीं पता कि आउटपुट को मेरे एप्लिकेशन में रीडायरेक्ट कैसे करें। घटनाओं का उपयोग कर प्रोग्राम चल रहा है, जबकि मुझे आउटपुट कैप्चर करने की जरूरत है।

कंसोल प्रोग्राम तब तक चलने के लिए नहीं है जब तक कि मेरा एप्लिकेशन बंद न हो और पाठ यादृच्छिक अंतराल पर लगातार बदल जाता है। मैं जो करने का प्रयास कर रहा हूं वह कंसोल से एक इवेंट हैंडलर ट्रिगर करने के लिए बस हुक आउटपुट है जिसे टेक्स्टबॉक्स को अपडेट करने के लिए उपयोग किया जा सकता है।

मैं प्रोग्राम को कोड करने और विकास के लिए .NET ढांचे का उपयोग करने के लिए सी # का उपयोग कर रहा हूं। मूल एप्लिकेशन एक .NET प्रोग्राम नहीं है।

संपादित करें: यहां उदाहरण का कोड है जो मैं करने की कोशिश कर रहा हूं। मेरे अंतिम ऐप में, मैं टेक्स्टबॉक्स को अपडेट करने के लिए कोड के साथ Console.WriteLine को प्रतिस्थापित करूंगा। मैंने अपने इवेंट हैंडलर में ब्रेकपॉइंट सेट करने का प्रयास किया, और यह भी नहीं पहुंचा।

void Method() 
    { 
     var p = new Process(); 
     var path = @"C:\ConsoleApp.exe"; 

     p.StartInfo.FileName = path; 
     p.StartInfo.UseShellExecute = false; 
     p.OutputDataReceived += p_OutputDataReceived; 

     p.Start(); 
    } 

    static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Console.WriteLine(">>> {0}", e.Data); 
    } 
+0

है की मेरी संशोधन है कहाँ 'है InputDataReceived'? –

उत्तर

69

यह मेरे लिए काम करता है:

void RunWithRedirect(string cmdPath) 
{ 
    var proc = new Process(); 
    proc.StartInfo.FileName = cmdPath; 

    // set up output redirection 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.RedirectStandardError = true;  
    proc.EnableRaisingEvents = true; 
    proc.StartInfo.CreateNoWindow = true; 
    // see below for output handler 
    proc.ErrorDataReceived += proc_DataReceived; 
    proc.OutputDataReceived += proc_DataReceived; 

    proc.Start(); 

    proc.BeginErrorReadLine(); 
    proc.BeginOutputReadLine(); 

    proc.WaitForExit(); 
} 

void proc_DataReceived(object sender, DataReceivedEventArgs e) 
{ 
    // output will be in string e.Data 
} 
+0

बिल्कुल वही जो मैं चाहता था :) –

+4

मैंने पाया कि कभी-कभी (प्रोग्राम से बाहर निकलने पर) ई। डेटा शून्य है, इसलिए आपको यह जांचना होगा कि e.Data! = Null! – mmmmmmmm

+0

+1 पहली बार मैंने देखा कि इस तरह का कुछ संपादन एडिटप्लस में था। अब मैं इसे अपने .NET कार्यक्रमों में कर सकता हूं। धन्यवाद दोस्त! –

1
+0

काफी नहीं, मुझे पाठ को कैप्चर करने की आवश्यकता है क्योंकि यह stdout पर लिखा जा रहा है। –

+0

यदि आप पोस्ट में दिए गए लिंक का पालन करते हैं, तो आप उसके लिए यहां कोड देखेंगे: http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/52e40c0f-66c7-49b1-ba48-457a1ff4a58d/ –

+0

हां, लेकिन वह कोड केवल एक बार चलता है। मैंने यह स्पष्ट करने के लिए अपना प्रश्न अपडेट किया कि मैं क्या करने का प्रयास कर रहा हूं। –

4

आप नीचे दिए गए कोड

 MemoryStream mem = new MemoryStream(1000); 
     StreamWriter writer = new StreamWriter(mem); 
     Console.SetOut(writer); 

     Assembly assembly = Assembly.LoadFrom(@"C:\ConsoleApp.exe"); 
     assembly.EntryPoint.Invoke(null, null); 
     writer.Close(); 

     string s = Encoding.Default.GetString(mem.ToArray()); 
     mem.Close(); 
+8

यदि "सी: \ ConsoleApp.exe" एक .NET एप्लिकेशन नहीं है तो यह नहीं चलेगा! – mmmmmmmm

+0

हाँ यह सच है –

1

मैं O2 Platform (मुक्त स्रोत परियोजना) के लिए सहायक तरीकों जिसे आप आसानी से की अनुमति देने के एक नंबर जोड़ दिया है का उपयोग कर सकते कंसोल आउटपुट और इनपुट के माध्यम से एक और प्रक्रिया के साथ एक बातचीत (http://code.google.com/p/o2platform/source/browse/trunk/O2_Scripts/APIs/Windows/CmdExe/CmdExeAPI.cs देखें)

आपके लिए भी उपयोगी एपीआई हो सकता है जो दर्शक को अनुमति देता है वर्तमान प्रक्रिया के कंसोल आउटपुट का एनजी (मौजूदा नियंत्रण या पॉपअप विंडो में)। अधिक जानकारी के लिए इस ब्लॉग पोस्ट को देखें: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (इस ब्लॉग में नई प्रक्रियाओं के कंसोल आउटपुट का उपभोग करने का विवरण भी शामिल है)

0

मार्क मैक्सहम को उनके उत्तर के लिए धन्यवाद जो मुझे समय बचाता है!

सभी ट्रेडों के जॉन के रूप में यह ध्यान दें, IO स्ट्रीम को पुनर्निर्देशित करने के लिए UseShellExecute को गलत पर सेट किया जाना चाहिए, अन्यथा स्टार्ट() कॉल एक अवैधऑपरेशन अपवाद फेंकता है।

यहाँ कोड जहां txtOut एक WPF केवल पढ़ने के लिए पाठ बॉक्स

void RunWithRedirect(string cmdargs) 
    { 
     var proc = new Process() 
     { 
      StartInfo = new ProcessStartInfo("cmd.exe", "/k " + cmdargs) 
      { 
       RedirectStandardOutput = true, 
       RedirectStandardError = true, 
       CreateNoWindow = true 
      }, 
      EnableRaisingEvents = true 
     }; 

     // see below for output handler 
     proc.ErrorDataReceived += proc_DataReceived; 
     proc.OutputDataReceived += proc_DataReceived; 

     proc.Start(); 

     proc.BeginErrorReadLine(); 
     proc.BeginOutputReadLine(); 

     proc.WaitForExit(); 
    } 

    void proc_DataReceived(object sender, DataReceivedEventArgs e) 
    { 
     if (e.Data != null) 
      Dispatcher.BeginInvoke(new Action(() => txtOut.Text += (Environment.NewLine + e.Data))); 
    } 
+0

कृपया अपना खुद का पोस्ट करने के बजाय मूल उत्तर संशोधित करें ताकि लेखक को क्रेडिट प्राप्त हो (y) –

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