2008-10-02 12 views
81

मैं एक बहुत ही सरल WPF परीक्षण अनुप्रयोग से Console.WriteLine() का उपयोग कर रहा हूं, लेकिन जब मैं कमांड लाइन से एप्लिकेशन निष्पादित करता हूं, तो मुझे कंसोल पर कुछ भी नहीं लिखा जा रहा है। क्या किसी को पता है कि यहां क्या हो रहा है?किसी WPF एप्लिकेशन से कंसोल करने के लिए कोई आउटपुट नहीं है?

मैं इसे वीएस 2008 में एक WPF एप्लिकेशन बनाकर पुन: पेश कर सकता हूं, और बस कंसोल। राइटलाइन ("टेक्स्ट") को कहीं भी निष्पादित कर सकता हूं। कोई विचार?

मुझे अभी बस कंसोल के रूप में सरल कुछ है। राइटलाइन()। मुझे एहसास है कि मैं log4net या किसी अन्य लॉगिंग समाधान का उपयोग कर सकता हूं, लेकिन मुझे वास्तव में इस एप्लिकेशन के लिए उस कार्यक्षमता की आवश्यकता नहीं है।

संपादित करें: मुझे याद रखना चाहिए था कि कंसोल। राइटलाइन() कंसोल अनुप्रयोगों के लिए है। ओह ठीक है, कोई बेवकूफ सवाल नहीं है, है ना? :-) मैं अभी सिस्टम का उपयोग करूंगा। डायग्नोस्टिक्स .race.WriteLine() और डीबग व्यू अब के लिए।

+0

संभावित डुप्लिकेट [ यहां] (http://stackoverflow.com/questions/3057852/how-do-i-write-to-command-line-from-a-wpf-application/3058921#3058921) और [यहां] (http: // stackoverflow.com/questions/10415807/output-console-writeline-from-wpf-windows-plplications-to-actual-console) (नया, लेकिन कुछ दिलचस्प उत्तरों के साथ [Kernel32.dll से AttachConsole] का उपयोग करके (https: // msdn .microsoft.com/en-us/लाइब्रेरी/विंडोज़/डेस्कटॉप/ms681952% 28v = vs.85% 29.aspx)) – Max

+1

@ मैक्स, ये प्रश्न * इस * प्रश्न के संभावित डुप्लिकेट हैं। आपके द्वारा पोस्ट किए गए प्रश्नों में से 2-4 साल पहले इस प्रश्न से पूछा गया था। –

उत्तर

78

आप मैन्युअल रूप से एक कंसोल विंडो बनाना होगा इससे पहले कि आप वास्तव में किसी कंसोल को कॉल करें। साइट विधि। यह कंसोल को प्रोजेक्ट प्रकार को बदलने के बिना ठीक से काम करने के लिए तैयार करेगा (जो WPF एप्लिकेशन के लिए काम नहीं करेगा)।

यहां एक पूर्ण स्रोत कोड उदाहरण है, कंसोल मैनेजर क्लास कैसा दिख सकता है, और प्रोजेक्ट प्रकार से स्वतंत्र रूप से कंसोल को सक्षम/अक्षम करने के लिए इसका उपयोग कैसे किया जा सकता है।

निम्नलिखित वर्ग के साथ

, तो आप सिर्फ Console.Write के लिए किसी भी कॉल करने से पहले कहीं ConsoleManager.Show() लिखने के लिए ...

[SuppressUnmanagedCodeSecurity] 
public static class ConsoleManager 
{ 
    private const string Kernel32_DllName = "kernel32.dll"; 

    [DllImport(Kernel32_DllName)] 
    private static extern bool AllocConsole(); 

    [DllImport(Kernel32_DllName)] 
    private static extern bool FreeConsole(); 

    [DllImport(Kernel32_DllName)] 
    private static extern IntPtr GetConsoleWindow(); 

    [DllImport(Kernel32_DllName)] 
    private static extern int GetConsoleOutputCP(); 

    public static bool HasConsole 
    { 
     get { return GetConsoleWindow() != IntPtr.Zero; } 
    } 

    /// <summary> 
    /// Creates a new console instance if the process is not attached to a console already. 
    /// </summary> 
    public static void Show() 
    { 
     //#if DEBUG 
     if (!HasConsole) 
     { 
      AllocConsole(); 
      InvalidateOutAndError(); 
     } 
     //#endif 
    } 

    /// <summary> 
    /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown. 
    /// </summary> 
    public static void Hide() 
    { 
     //#if DEBUG 
     if (HasConsole) 
     { 
      SetOutAndErrorNull(); 
      FreeConsole(); 
     } 
     //#endif 
    } 

    public static void Toggle() 
    { 
     if (HasConsole) 
     { 
      Hide(); 
     } 
     else 
     { 
      Show(); 
     } 
    } 

    static void InvalidateOutAndError() 
    { 
     Type type = typeof(System.Console); 

     System.Reflection.FieldInfo _out = type.GetField("_out", 
      System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 

     System.Reflection.FieldInfo _error = type.GetField("_error", 
      System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 

     System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError", 
      System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 

     Debug.Assert(_out != null); 
     Debug.Assert(_error != null); 

     Debug.Assert(_InitializeStdOutError != null); 

     _out.SetValue(null, null); 
     _error.SetValue(null, null); 

     _InitializeStdOutError.Invoke(null, new object[] { true }); 
    } 

    static void SetOutAndErrorNull() 
    { 
     Console.SetOut(TextWriter.Null); 
     Console.SetError(TextWriter.Null); 
    } 
} 
+0

मुझे यह पसंद है, यह काम करता है, और मैं इसे अन्य परियोजनाओं में उपयोग कर सकता हूं। हालांकि, क्योंकि यह एक नई कंसोल विंडो लॉन्च करता है, यह एक मौजूदा परियोजना के साथ एक मुद्दा का कारण बनता है। यदि मैं कमांड लाइन विकल्प में पास करता हूं तो कंसोल पर आउटपुट करने में सक्षम होना चाहूंगा जिसे इसे लॉन्च किया गया था ताकि उपयोगकर्ता वहां आउटपुट प्राप्त कर सके।मेरे ऐप में यदि कमांड लाइन विकल्प प्रदान किए जाते हैं तो यह एक कंसोल ऐप रहता है और फिर उसका काम करता है और फिर बाहर निकलता है। यह ऐप को स्वचालित करने और कार्य करने के लिए शेड्यूल करने की अनुमति देता है, या उपयोगकर्ता बस कुछ जल्दी कर सकता है और बाहर निकल सकता है। हालांकि मैं कुछ चीजों को आउटपुट करना चाहता हूं, जैसे सहायता उपयोग सामग्री इत्यादि। –

+0

_out और _error को शून्य पर सेट करने के साथ अच्छा हैक। होशियार! – BFree

+0

क्या यह या किसी अन्य तकनीक का उपयोग कर एक WPF विंडो के भीतर कंसोल विंडो को एम्बेड करना संभव है? – InfinitiesLoop

-14

जहाँ तक मुझे पता है, Console.WriteLine() केवल कंसोल अनुप्रयोगों के लिए है। मुझे लगता है कि यह तुम्हारी समस्या है।

+1

मुझे डब्ल्यूपीएफ के बारे में पता नहीं है, लेकिन यह निश्चित रूप से WinForms के मामले में नहीं है। Console.WriteLine ठीक काम करता है, लेकिन, ज़ाहिर है, आप कंसोल नहीं देखेंगे, आप इसे डीबगर आउटपुट विंडो में देखेंगे और यदि आप मानक आउटपुट सुनते हैं। –

+2

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

+0

यह गलत है, गैर कंसोल एप्लिकेशन की बिल्ड प्रक्रिया डिफॉल्ट द्वारा कंसोल को संलग्न नहीं करती है। कंसोल पर किसी भी कॉल से पहले आप AllocConsole() Win32 API फ़ंक्शन को कॉल करके मैन्युअल रूप से ऐसा कर सकते हैं। राइट, कंसोल क्लास को उस कंसोल विंडो के साथ काम करने के लिए प्रारंभ किया जाएगा। –

102

प्रोजेक्ट पर राइट क्लिक करें, "गुण", "एप्लिकेशन" टैब, "आउटपुट प्रकार" को "कंसोल एप्लिकेशन" में बदलें, और उसके बाद इसमें एक कंसोल भी होगा।

+1

इसके साथ एकमात्र मुद्दा यह है कि आपके पास पृष्ठभूमि में एक cmd खुला होगा, लेकिन यह काम करता है :)। – ykatchou

+4

ग्रेट, लेकिन कमांड लाइन विंडो बनाई जाएगी जब अनुप्रयोग cmd.exe (एक एप्लिकेशन के लिए बनाई गई दो विंडो) से निष्पादित नहीं किया जाता है। लेकिन इसके लिए समाधान भी है: आप ShowWindow (एचडब्ल्यूएनडी, 0) द्वारा cmd विंडो छुपा सकते हैं। http://stackoverflow.com/a/10416180/1457197। इस समाधान का उपयोग करके आप केवल कंसोल में टेक्स्ट देखेंगे जब WPF एप्लिकेशन कमांड लाइन से निष्पादित किया जाता है। – CoperNick

+0

नोट करें कि आपको ब्लेंड में काम करते समय इसे "विंडो एप्लिकेशन" पर वापस स्विच करना होगा, क्योंकि यह केवल "कंसोल एप्लिकेशन" प्रकारों के लिए XAML (डिज़ाइन व्यू तक पहुंच के बिना) दिखाता है। (मिश्रण 2013 के रूप में) –

91

आप (जब डिबगिंग) दृश्य स्टूडियो में "उत्पादन" खिड़की के

Trace.WriteLine("text"); 

हो जाएगा ताकि उत्पादन का उपयोग कर सकते हैं।

निदान विधानसभा शामिल है सुनिश्चित करें:

using System.Diagnostics; 
+0

आसान, सरल। Thx – rluks

+7

यह सबसे अच्छा जवाब है, लेकिन उच्चतम रेटिंग नहीं है – kiltek

+0

मैं सहमत हूं - यह वही है जो ओप पूछ रहा है। Console.WriteLine() के लिए शानदार विकल्प - उत्तर के रूप में चिह्नित समाधान एक साफ अभ्यास है लेकिन उत्पादन अनुप्रयोग में शामिल करने के लिए अनुचित है। – nocarrier

3

मैं आउटपुट विंडो में उपयोग के लिए Console.WriteLine() का उपयोग करें ...

+4

यह एक 4 साल पुराना सवाल है जिसे मैंने पहली बार संपादित किया है क्योंकि मैंने इसे देखा है। अब निश्चित रूप से सवाल बेहतर शब्द दिया गया है और मेरी प्रतिक्रिया अप्रासंगिक बना दी गई थी। – erodewald

9

हालांकि जॉन Leidegren विचार नीचे शूटिंग रहता है की जरूरत है, ब्रायन सही है। मैंने इसे विजुअल स्टूडियो में अभी काम कर लिया है।

एक WPF एप्लिकेशन साफ़ करने के लिए डिफ़ॉल्ट रूप से एक कंसोल विंडो नहीं बनाता है।

आपको एक WPF एप्लिकेशन बनाना है और फिर आउटपुट टाइप को "कंसोल एप्लिकेशन" में बदलना है। जब आप प्रोजेक्ट चलाते हैं तो आपको इसके सामने अपनी डब्ल्यूपीएफ विंडो के साथ एक कंसोल विंडो दिखाई देगी।

यह बहुत सुंदर नहीं दिखता है, लेकिन मुझे यह उपयोगी लगता है क्योंकि मैं चाहता था कि मेरा ऐप वहां कमांड लाइन से कमांड लाइन से चलाया जाए, और फिर कुछ कमांड विकल्पों के लिए मैं WPF विंडो प्रदर्शित करूंगा।

+1

बिल्कुल सही। नौकरी है – frostymarvelous

8

command line redirection का उपयोग कर कंसोल के लिए आउटपुट आउटपुट देखना संभव है।

उदाहरण के लिए:

C:\src\bin\Debug\Example.exe > output.txt 

output.txt फाइल करने के लिए सभी सामग्री को लिखेंगे।

4

पुरानी पोस्ट है, लेकिन मैं इस में भाग इसलिए यदि आप दृश्य स्टूडियो में एक WPF परियोजना में उत्पादन करने के लिए उत्पादन कुछ करने के लिए कोशिश कर रहे हैं, समकालीन विधि है:

शामिल करें:

using System.Diagnostics; 

और फिर:

Debug.WriteLine("something"); 
संबंधित मुद्दे