2009-05-07 13 views
20

क्या लागू करने के लिए सही तरीका और वास्तुकार एक सी # कंसोल आवेदन के रूप में एक कमांड लाइन उपकरण है?सी # कंसोल एप्लिकेशन को लागू करने का सही तरीका?

पते के लिए चिंता में कमांड लाइन चर के उचित पार्सिंग, और पाठ को आउटपुट करने का उचित तरीका शामिल है। जबकि Console.WriteLine() उत्पादन के लिए सबसे स्पष्ट विकल्प है, जिन परिस्थितियों में एक के बजाय मानक त्रुटि धारा, .त्रुटि, .SetErrorStream, आदि के लिए लिखने के लिए चुनते चाहिए क्या हैं?

कॉलिंग कमांड पर उचित रिटर्न कोड लौटाते समय एप्लिकेशन से बाहर निकलने का उचित तरीका क्या है?

प्रोग्राम को बाधित करने के लिए CancelKeyPress ईवेंट को कैसे कार्यान्वित किया जाना चाहिए? क्या यह केवल तभी उपयोग के लिए है जब एक अलग थ्रेड पर एक असीमित ऑपरेशन हो रहा है?

वहाँ सी # में लाइन उपकरण प्रोग्रामिंग, या और भी बेहतर एक ओपन सोर्स प्रोजेक्ट या टेम्पलेट जो मैं ठीक से एक अपेक्षाकृत सरल उपकरण को लागू करने के लिए इस्तेमाल कर सकते हैं कमान एक संक्षिप्त गाइड है?

+0

डुप्ली? यहां देखें: http://stackoverflow.com/questions/817673/architectural-considerations-in-designing-console-applications –

+0

यह भी देखें: http://stackoverflow.com/questions/664533/best-command-line- विकल्प- पार्सर्स-फॉर-सीसी-एंड-सी-बंद –

+1

मेरा प्रश्न .NET कंसोल एप्लिकेशन मैकेनिक्स का एक व्यापक अन्वेषण है - जिसमें त्रुटिस्ट्रीम और CancelKeyPress ईवेंट का उपयोग करने का सही तरीका शामिल है। वे दो पद क्रमशः कमांड लाइन पार्सिंग और क्लास स्ट्रक्चर से संबंधित हैं। – James

उत्तर

25

त्रुटि संदेश उर्फ ​​Console.Error, और सामान्य उत्पादन stderr को उर्फ ​​Console.Out stdout करने के लिए लिखा जाना चाहिए। यह "फिल्टर" प्रकार कंसोल ऐप्स के लिए विशेष रूप से महत्वपूर्ण है जिनके आउटपुट (stdout) को दूसरी प्रक्रिया में पाइप किया जा सकता है, उदा। एक बैच फ़ाइल में।

आम तौर पर यदि आपको कोई त्रुटि आती है, तो कंसोल पर एक त्रुटि संदेश लिखें। त्रुटि और गैर-शून्य परिणाम लौटाएं। या यदि यह एक अपवाद है, तो इसे संभालने से परेशान न हों।

एक परिणाम कोड लौटने के लिए, आप या तो Environment.Exit लिए एक तर्क के रूप में यह पारित कर सकते हैं, Environment.ExitCode गुण सेट, या मुख्य से एक गैर शून्य मान।

  • कमांड लाइन पार्स करने के लिए एक सहायक वर्ग है:

    सरल सांत्वना क्षुधा मैं करूंगा लिए

  • में एक मुखौटा वर्ग है जो आपके कमांड लाइन टूल द्वारा कार्यान्वित कार्यक्षमता के लिए एक टेस्टेबल एपीआई प्रदान करता है। अधिकांश .NET API की तरह, यदि कोई त्रुटि उत्पन्न होती है तो यह आमतौर पर अपवाद फेंक देगा।

  • मुख्य प्रोग्राम बस कमांड लाइन पार्स करने के लिए सहायक का उपयोग करता है और तर्क कमांड लाइन से पारित कर दिया गुजर API कॉल। यह वैकल्पिक रूप से एपीआई से फेंकने वाले अपवादों को पकड़ता है, उन्हें लॉग करता है, कंसोल पर उपयोगकर्ता-उन्मुख त्रुटि संदेश लिखता है। त्रुटि और गैर-शून्य रिटर्न कोड सेट करता है।

लेकिन मैं विचार यह एक सच रास्ता wouln't: वहाँ वास्तव में ऐसी बात है, जिसके कारण आप पुस्तक आप के लिए देख रहे हैं उसे प्राप्त करने की संभावना नहीं कर रहे हैं नहीं है।

2

आदेश पंक्ति तर्क के लिए, आप विभिन्न योजनाओं मिल जाएगा, लेकिन मैं हमेशा

app.exe "self-explanatory arg" /noArgumentSwitch /argumentSwitch="argument" 

वापसी कोड के रूप में के एक प्रशंसक किया गया है, तो आप वापस जाने के लिए अपने Main() समारोह के हस्ताक्षर को बदल सकते हैं void के बजाय int। यदि आवश्यक हो तो यह आपको कॉलिंग प्रक्रिया में कोड वापस करने की अनुमति देगा।

त्रुटि धारा का सवाल है, मैं व्यक्तिगत रूप से यह कभी नहीं का उपयोग किया है, और मुझे नहीं लगता है कि यह मानक आउटपुट धारा में त्रुटि जानकारी outputting की कीमत पर आना चाहिए है। यह संभवतः विशिष्ट त्रुटि डीबगिंग जानकारी के लिए बेहतर उपयोग किया जाता है।

5

कमांड पार्सिंग को कार्यान्वित करने के तरीके के रूप में, मैंने सफलतापूर्वक प्रतिबिंब और प्रतिनिधियों का उपयोग किया है। वे जिस तरह से यह काम करता है आप अपने आप को विधि कहा गया है कि उपयोगकर्ता के invokable होना चाहिए एक विशेष विशेषता के साथ आदेश तरीकों को सजाने के लिए है, या तो विधि का नाम या एक स्ट्रिंग विशेषता में निर्दिष्ट अर्थात के माध्यम से:

[Command("quit")] 
public void QuitApp() 
{ 
    ... 
} 

कार्यक्रम पर स्टार्टअप आप इस तरह के तरीकों के लिए कक्षा को स्कैन कर सकते हैं, और उन प्रतिनिधियों को स्टोर कर सकते हैं जो उन्हें एक शब्दकोश में लक्षित करते हैं जहां कुंजी कमांड हैं। यह एक शब्दकोश में पहले शब्द को देखने के आधार पर आदेशों को पार्स करना आसान बनाता है (एमओटीकृत ओ (1)) और भविष्य के लिए आसानी से एक्स्टेंसिबल और रखरखाव योग्य है, क्योंकि नए कमांड को अलग-अलग तरीकों को जोड़ना जोड़ा जाता है।

2

कमांड लाइन हैंडलिंग के लिए, Mono.GetOptions देखें। यह लघु (-f शैली) और लंबी (- फ़ाइल शैली) कमांड लाइन विकल्पों से चर को पॉप्युलेट करना आसान बनाता है।

0

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

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