2012-08-11 20 views
9

पर रीडायरेक्ट करें। मेरे पास सी # में एक बाहरी डीएल लिखा गया है और मैंने असेंबली दस्तावेज से अध्ययन किया है कि यह Console.WriteLine का उपयोग कर कंसोल पर अपने डीबग संदेश लिखता है।विंडोज अनुप्रयोग से कंसोल। राइटलाइन को एक स्ट्रिंग

यह डीएलएल आवेदन के यूआई के साथ मेरी बातचीत के दौरान कंसोल को लिखता है, इसलिए मैं सीधे डीएलएल कॉल नहीं करता हूं, लेकिन मैं सभी कंसोल आउटपुट कैप्चर करता हूं, इसलिए मुझे लगता है कि मुझे फॉर्म लोड में इंटिलाइज करना है, फिर मुझे बाद में पाठ पर कब्जा कर लिया।

मैं सभी आउटपुट को स्ट्रिंग वैरिएबल पर रीडायरेक्ट करना चाहता हूं।

मैंने Console.SetOut की कोशिश की, लेकिन स्ट्रिंग पर रीडायरेक्ट करने के लिए इसका उपयोग आसान नहीं है।

+0

क्या कोड आप जब 'SetOut' विधि का उपयोग करने की कोशिश कर उपयोग किया था? –

उत्तर

18

ऐसा लगता है के रूप में की तरह आप वास्तविक समय में कंसोल आउटपुट को पकड़ने के लिए चाहते हैं, तो मैं पता लगा है कि आप अपने खुद के TextWriter कार्यान्वयन कि एक गतिविधि सक्रिय जब भी कोई Write या WriteLineConsole पर होता है बना सकते हैं।

लेखक इस तरह दिखता है:

public class ConsoleWriterEventArgs : EventArgs 
    { 
     public string Value { get; private set; } 
     public ConsoleWriterEventArgs(string value) 
     { 
      Value = value; 
     } 
    } 

    public class ConsoleWriter : TextWriter 
    { 
     public override Encoding Encoding { get { return Encoding.UTF8; } } 

     public override void Write(string value) 
     { 
      if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value)); 
      base.Write(value); 
     } 

     public override void WriteLine(string value) 
     { 
      if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value)); 
      base.WriteLine(value); 
     } 

     public event EventHandler<ConsoleWriterEventArgs> WriteEvent; 
     public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent; 
    } 

यह एक WinForm अनुप्रयोग, आप सेटअप लेखक कर सकते हैं और इस तरह Program.cs के ईवेंट को उपभोग हैं:

/// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     using (var consoleWriter = new ConsoleWriter()) 
     { 
      consoleWriter.WriteEvent += consoleWriter_WriteEvent; 
      consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent; 

      Console.SetOut(consoleWriter); 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 

    static void consoleWriter_WriteLineEvent(object sender, Program.ConsoleWriterEventArgs e) 
    { 
     MessageBox.Show(e.Value, "WriteLine"); 
    } 

    static void consoleWriter_WriteEvent(object sender, Program.ConsoleWriterEventArgs e) 
    { 
     MessageBox.Show(e.Value, "Write"); 
    } 
+0

यह डीएलएल एप्लिकेशन के यूआई के साथ मेरी बातचीत के दौरान कंसोल लिखता है, इसलिए मैं सीधे डीएलएल कॉल नहीं करता हूं, लेकिन मैं सभी कंसोल आउटपुट कैप्चर करता हूं, इसलिए मुझे लगता है कि मुझे फॉर्म लोड में इंटिलाइज करना है, फिर उस कैप्चर टेक्स्ट को प्राप्त करें बाद में। – geogeek

+0

क्या यह एक WinForms ऐप है? जब कार्यक्रम प्रवाह में आपको आउटपुट की आवश्यकता होती है? –

+0

हाँ यह एक सी # Winform ऐप है, मुझे एक जीयूआई घटना के बाद कंसोल आउटपुट कैप्चर करने की आवश्यकता है। – geogeek

17

यह मूल रूप से निम्नलिखित के बराबर है:

var originalConsoleOut = Console.Out; // preserve the original stream 
using(var writer = new StringWriter()) 
{ 
    Console.SetOut(writer); 

    Console.WriteLine("some stuff"); // or make your DLL calls :) 

    writer.Flush(); // when you're done, make sure everything is written out 

    var myString = writer.GetStringBuilder().ToString(); 
} 

Console.SetOut(originalConsoleOut); // restore Console.Out 

तो आपके मामले में आप अपने तीसरे पक्ष DLL करने के लिए कॉल करने से पहले इस सेट करेंगे अप।

+0

यह डीएलएल एप्लिकेशन के यूआई के साथ मेरी बातचीत के दौरान कंसोल लिखता है, इसलिए मैं सीधे डीएलएल कॉल नहीं करता हूं, लेकिन मैं सभी कंसोल आउटपुट कैप्चर करता हूं, इसलिए मुझे लगता है कि मुझे फॉर्म लोड में इंटिलाइज करना है, फिर उस कैप्चर टेक्स्ट को प्राप्त करें बाद में। – geogeek

1

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

public string RunCodeReturnConsoleOut(Action code) 
{ 
    string result; 
    var originalConsoleOut = Console.Out; 
    try 
    { 
    using (var writer = new StringWriter()) 
    { 
     Console.SetOut(writer); 
     code(); 
     writer.Flush(); 
     result = writer.GetStringBuilder().ToString(); 
    } 
    return result; 
    } 
    finally 
    { 
    Console.SetOut(originalConsoleOut); 
    } 
} 
0

तुम भी Console.OpenStandardOutput साथ setout कॉल कर सकते हैं, इस मूल उत्पादन धारा को बहाल होगा:

Console.SetOut(new StreamWriter(Console.OpenStandardOutput())); 
संबंधित मुद्दे