2011-08-26 16 views
42

वर्तमान में मेरे पास एक जीयूआई के साथ एक आवेदन है।सी # आवेदन दोनों जीयूआई और कमांडलाइन

क्या यह वही एप्लिकेशन कमांडलाइन से (GUI के बिना और पैरामीटर का उपयोग करके) का उपयोग करना संभव होगा।

या क्या मुझे कमांडलाइन उपकरण के लिए एक अलग .exe (और एप्लिकेशन) बनाना है?

+0

आप पूरी तरह एक ही आवेदन का उपयोग कर सकते हैं। बस अपनी मुख्य विधि –

+0

पर 'स्ट्रिंग [] args' जोड़ें या, इस प्रश्न के उत्तर देखें: http://stackoverflow.com/questions/1179532/ –

+0

चूंकि आप कंसोल से इनपुट पढ़ने के बारे में नहीं पूछ रहे हैं (केवल कमांड लाइन पैरामीटर से), यह एक डुप्ली है। –

उत्तर

55
  1. संपादित करें आपका ऐप्लिकेशन किसी "विंडोज आवेदन" (नहीं "कंसोल एप्लिकेशन") बनाने के लिए अपनी परियोजना के गुण। आप अभी भी कमांड लाइन पैरामीटर स्वीकार कर सकते हैं। यदि आप ऐसा नहीं करते हैं, तो जब आप ऐप के आइकन पर डबल-क्लिक करते हैं तो एक कंसोल विंडो पॉप अप हो जाएगी।
  2. सुनिश्चित करें कि आपका Main फ़ंक्शन कमांड लाइन पैरामीटर स्वीकार करता है।
  3. यदि आपको कोई कमांड लाइन पैरामीटर मिलता है तो विंडो न दिखाएं।

    [STAThread] 
    static void Main(string[] args) 
    { 
        if(args.Length == 0) 
        { 
         Application.Run(new MyMainForm()); 
        } 
        else 
        { 
         // Do command line/silent logic here... 
        } 
    } 
    

    अपने एप्लिकेशन पहले से ही संरचित नहीं है, तो करने के लिए सफाई से कर चुप प्रसंस्करण (यदि आपके सभी तर्क अपने WinForm कोड में जाम है), आप कर सकते हैं hack silent processing in ala CharithJ's answer:

यहाँ एक छोटी उदाहरण है।

ओपी द्वारा संपादित करें अपने उत्तर Merlyn को हाइजैक करने के लिए खेद है। बस दूसरों के लिए सभी जानकारी चाहते हैं।

एक WinForms अनुप्रयोग में सांत्वना देने लिखने के लिए सक्षम होने के लिए सिर्फ निम्न कार्य करें:

static class Program 
{ 
    // defines for commandline output 
    [DllImport("kernel32.dll")] 
    static extern bool AttachConsole(int dwProcessId); 
    private const int ATTACH_PARENT_PROCESS = -1; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
     // redirect console output to parent process; 
     // must be before any calls to Console.WriteLine() 
     AttachConsole(ATTACH_PARENT_PROCESS); 

     if (args.Length > 0) 
     { 
      Console.WriteLine("Yay! I have just created a commandline tool."); 
      // sending the enter key is not really needed, but otherwise the user thinks the app is still running by looking at the commandline. The enter key takes care of displaying the prompt again. 
      System.Windows.Forms.SendKeys.SendWait("{ENTER}"); 
      Application.Exit(); 
     } 
     else 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new QrCodeSampleApp()); 
     } 
    } 
} 
+0

'यदि आपका सभी तर्क आपके WinForm कोड में जाम हो गया है। यह है: पी हालांकि यह एक अच्छी बात है, क्योंकि मैं एक पूर्ण नौसिखिया हूं, और क्योंकि यह मुझे 'गधे में काटता है' अब मैं इसे भविष्य की परियोजनाओं के लिए याद रखूंगा। मुझे लगता है कि मेरे पास कुछ सफाई है। – PeeHaa

+0

सोने से पहले आखिरी सवाल: क्या मैं कमांडलाइन को एक संदेश लिखने में सक्षम हूं, उदाहरण के लिए प्रोग्राम चलाना समाप्त हो गया है? या यह या तो एक अलग ऐप है जो कमांडलाइन पर लिख सकता है या कमांडलाइन पर नहीं लिख सकता है? – PeeHaa

+0

@PeeHaa: मुझे यह काम करने के लिए प्रतीत नहीं होता है, लेकिन googling का प्रयास करें: "AttachConsole Console.WriteLine" * या * "AllocConsole Console.WriteLine"। मैं इसके बजाय एक लॉगिंग लाइब्रेरी का उपयोग करने का सुझाव दूंगा, जैसे कि: http://netcommon.sourceforge.net/ (एनएलओजी के साथ जोड़ा गया)। –

-2

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

लेकिन कंसोल विंडो से कमांड स्वीकार करने के लिए, मुझे लगता है कि आपको इसे करने के लिए एक अतिरिक्त थ्रेड बनाना होगा।

+0

यह एक अच्छा विकल्प नहीं है क्योंकि यह फ़ाइल आइकन पर डबल-क्लिक करके इसे लॉन्च करने पर अतिरिक्त कंसोल उत्पन्न करेगा। इसके अलावा, आपको जरूरी नहीं कि एक और थ्रेड फेंकना पड़े - उदाहरण के लिए, यदि आप कमांड लाइन पैरामीटर के माध्यम से अपना "कमांड" पास करते हैं। –

-1

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

+1

इसे कंसोल ऐप न बनाएं। अन्यथा जब आप इसे जीयूआई के रूप में लॉन्च करते हैं तो एक कंसोल पॉप अप हो जाएगा। –

9

आपके प्रोग्राम.cs कक्षा में मुख्य विधि को रखें क्योंकि यह मुख्य रूप में string[] Args जोड़ें। उदाहरण के लिए ...

[STAThread] 
    static void Main(string[] Args) 
    { 
     .... 
     Application.Run(new mainform(Args)); 
    } 

mainform.cs निर्माता में

public mainform(string[] Args) 
    { 
     InitializeComponent(); 

     if (Args.Length > 0) 
     { 
      // Do what you want to do as command line application. 
      // You can hide the form and do processing silently. 
      // Remember to close the form after processing. 
     } 
    } 
+3

इसे करने का सबसे अच्छा तरीका – xbonez

+2

+1; लेकिन अगर आप कंसोल ऐप के रूप में चल रहे हैं तो 'एप्लिकेशन' रून करने से भी परेशान न हों। खिड़की को छिपाना काम करेगा, लेकिन यह एक हैक है :) –

+3

दोष यह है कि आप कंसोल विंडो में कोई आउटपुट नहीं देख पाएंगे क्योंकि एप्लिकेशन से जुड़ी वास्तविक कंसोल विंडो नहीं है। 'Console.WriteLine' किसी भी दृश्य आउटपुट का उत्पादन नहीं करेगा। –

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