2010-05-11 12 views
12

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

यहां मुख्य वर्ग के लिए कोड है:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     string[] args = Environment.GetCommandLineArgs(); 
     if (args.Length > 1) // gets passed its path, by default 
     { 
      CommandLineWork(args); 
      return; 
     }   

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

    private static void CommandLineWork(string[] args) 
    { 
     Console.WriteLine("It works!"); 
     Console.ReadLine(); 
    } 

जहां Form1 मेरी रूप है और It works! स्ट्रिंग सिर्फ वास्तविक तर्क के लिए एक प्लेसहोल्डर है।

अभी विज़ुअल स्टूडियो (कमांड लाइन तर्क के साथ) से इसे चलाने पर, It works! वाक्यांश को आउटपुट पर मुद्रित किया गया है। हालांकि, /bin/Debug/Program.exe फ़ाइल (या उस मामले के लिए रिलीज़) चलाते समय एप्लिकेशन क्रैश हो जाता है।

क्या मैं इस बारे में सही तरीके से जा रहा हूं? क्या यह अधिक तर्कसंगत होगा (यानी कम डेवलपर का समय लें) मेरी लॉजिक क्लास एक डीएलएल हो जो दो अलग-अलग अनुप्रयोगों से लोड हो जाए? या क्या ऐसा कुछ अलग है जो मुझे पता नहीं है?

अग्रिम धन्यवाद!

+0

ऐप क्रैश होने पर आपको क्या अपवाद मिल रहा है? साथ ही, मुझे लगता है कि यह तर्क होना चाहिए। लम्बाई> = 1 (या> 0)> 1 के बजाय? –

उत्तर

22

यदि आप कमांड लाइन तर्क का पता लगाते हैं तो आपको Poc/AllocConsole() को आमंत्रित करने की आवश्यकता होगी। आवश्यक कोड के लिए this thread में मेरा उत्तर देखें। एक सी # नमूना पृष्ठ के नीचे आगे है। यहाँ दोहराया क्योंकि मुझे लगता है कि फालतू मंच साइट पर विश्वास नहीं है:

using System; 
using System.Windows.Forms; 

namespace WindowsApplication1 { 
    static class Program { 
    [STAThread] 
    static void Main(string[] args) { 
     if (args.Length > 0) { 
     // Command line given, display console 
     AllocConsole(); 
     ConsoleMain(args); 
     } 
     else { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
     } 
    } 
    private static void ConsoleMain(string[] args) { 
     Console.WriteLine("Command line = {0}", Environment.CommandLine); 
     for (int ix = 0; ix < args.Length; ++ix) 
     Console.WriteLine("Argument{0} = {1}", ix + 1, args[ix]); 
     Console.ReadLine(); 
    } 

    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool AllocConsole(); 
    } 
} 
+1

आप 'फ्रीकंसोल' का भी उपयोग कर सकते हैं: http://stackoverflow.com/questions/1786840/c-is-it-possible-to-have-a-single-plication-behave-as-console-or-windows-appl/1787008 # 1787008 – adrianbanks

+1

क्यों न केवल इसे पहले कंसोल ऐप बनाएं और फिर विंडोिंग के लिए फॉर्म असेंबली का संदर्भ लें? –

+0

@ क्रिस: केवल मांग पर एक कंसोल प्राप्त करें, हमेशा नहीं। फ्रीकंसोल एक * बुरा * फ्लैश है। –

1

हां दो फ्रंटेंड बनाने के लिए बेहतर होगा .exes (कमांड लाइन के लिए एक और खिड़की के लिए एक)।

मुख्य कारण आप अपने प्रोजेक्ट (या तो कमांड लाइन या Windows आवेदन के लिए उत्पादन के प्रकार का उल्लेख करने के लिए है और आप दोनों का चयन नहीं कर सकते हैं।

इसलिए आप हमेशा विंडोज़ अनुप्रयोग उत्पादन प्रकार का उपयोग करने के लिए होगा (जो विंडोज संदेश प्रणाली के लिए एक ओवरहेड पर आता है और आप "असली" कमांड लाइन नहीं देता है)।

1

सुनिश्चित नहीं हैं कि अगर यह एक फर्क नहीं पड़ता लेकिन बजाय

static void Main() 
{ 
     string[] args = Environment.GetCommandLineArgs(); 

आप के बजाय

डाल सकते हैं
static void Main(string[] args) 
{ 
+2

चूंकि यह समस्या के समाधान का कोई समाधान नहीं है, यह एक टिप्पणी नहीं होनी चाहिए? – Peter

0

आप वास्तव में डेटा दर्ज करने आदि उपयोगकर्ता पूछ के साथ एक वास्तविक सांत्वना एप्लिकेशन के रूप में इसे चलाने के लिए जा रहे हैं, या आप बस इसे शुरू करने जा रहे हैं कुछ तर्कों के साथ ताकि इसे बैच फ़ाइल या निर्धारित शेड्यूल या इसी तरह से चलाया जा सके?

यह एक वास्तविक सांत्वना अनुप्रयोग है, तो मुझे लगता है कि यह शायद 2 exe फ़ाइलों बनाना उचित है Foxfire के साथ सहमत हैं, लेकिन अन्यथा मैं एक exe के रूप में रखना चाहते हैं। मैंने बिना किसी मुद्दे के उन लोगों में से बहुत कुछ किया है।

सटीक अपवाद है कि हालांकि उत्पन्न है क्या है?

0
जाओ परियोजना गुण

आवेदन टैब आपको एक ड्रॉपडाउन सूची नामित आउटपुट प्रकार देखना चाहिए पर करने के लिए

कंसोल आवेदन को यह बदलें।

वहां, आपके पास एक खिड़की और कंसोल दोनों हैं। अब कमांड तर्क के साथ आपका कोड काम करना चाहिए।

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