2010-04-22 15 views
89

जब मैं प्रोग्रामिंग की बात करता हूं तो मैं शुरुआत करता हूं लेकिन मुझे यकीन था कि सार्वभौमिक नियमों में से एक यह था कि एक कार्यक्रम मुख्य() से शुरू होता है। जब मैं एक WPF प्रोजेक्ट बनाता हूं तो मुझे कोई नहीं दिखाई देता है। क्या मुख्य() ने बस WPF में कुछ अलग नाम दिया है?कोई मुख्य() WPF में?

+10

आप App.xaml.cs. पर ऑनस्टार्टअप को ओवरराइड करके समकक्ष कार्यक्षमता प्राप्त कर सकते हैं। StartupEventArgs.Args में कमांडलाइन तर्क शामिल हैं। – Foole

+1

@ फ़ोल, नहीं, आप नहीं देख सकते, [यह] (http://stackoverflow.com/q/22460116/1997232) प्रश्न देखें। – Sinatr

उत्तर

57

यह निर्माण के दौरान उत्पन्न होता है, लेकिन आप अपना खुद का प्रदान कर सकते हैं (इसे आवश्यकतानुसार परियोजना-गुणों में असंबद्ध कर सकते हैं)। एक ऐप फ़ाइल के लिए obj/डीबग में देखें; मैं के साथ App.g.i.cs ("C# 2010 एक्सप्रेस" सौजन्य से) है:

namespace WpfApplication1 { 


    /// <summary> 
    /// App 
    /// </summary> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] 
    public partial class App : System.Windows.Application { 

     /// <summary> 
     /// InitializeComponent 
     /// </summary> 
     [System.Diagnostics.DebuggerNonUserCodeAttribute()] 
     public void InitializeComponent() { 

      #line 4 "..\..\..\App.xaml" 
      this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); 

      #line default 
      #line hidden 
     } 

     /// <summary> 
     /// Application Entry Point. 
     /// </summary> 
     [System.STAThreadAttribute()] 
     [System.Diagnostics.DebuggerNonUserCodeAttribute()] 
     public static void Main() { 
      WpfApplication1.App app = new WpfApplication1.App(); 
      app.InitializeComponent(); 
      app.Run(); 
     } 
    } 
} 
+0

वही बात 'App.g.cs' में भी मौजूद है। लेकिन मैंने 'मुख्य()' में जोड़ने की कोशिश की और हर बार जब मैं अपनी परियोजना का पुनर्निर्माण करूंगा, तो यह आपके पास जो कुछ है, उस पर वापस आ जाएगा। किसी अन्य वर्ग में अपना खुद का निर्माण करने का प्रयास किया, लेकिन परियोजना गुण केवल MyProject.App को पाता है, अन्य वर्ग नहीं, इसलिए इसे पुनर्निर्देशित नहीं किया जा सकता है। – vapcguy

6

Main() संकलन के दौरान उत्पन्न होता है। आप इसे App.g.cs (obj/{Debug,Release} फ़ोल्डर में) में पा सकते हैं।

5

main() एक आवेदन के लिए एक मानक प्रवेश बिंदु है, लेकिन उन सभी एप्लिकेशन को जिस तरह से संरचित कर रहे हैं। एक एक्सएएमएल प्रोजेक्ट में, App.XAML फ़ाइल एंट्री पॉइंट निर्दिष्ट करती है जहां यह StartupUri="MainWindow.xaml" कहती है।

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

12

Main() स्वचालित रूप से CLR और WPF द्वारा प्रदान की जाती है।

सी # कंपाइलर एक कमांड लाइन स्विच /m लेता है जो Main() के कार्यान्वयन वाले प्रकार को निर्दिष्ट करता है। सम्मेलन से, यदि कोई स्टार्टअप ऑब्जेक्ट स्पष्ट रूप से निर्दिष्ट नहीं किया गया है, तो सीएलआर किसी भी कक्षा को देखेगा जिसमें स्थिर Main() विधि है और इसे कॉल किया जाएगा। WPF के मामले में

(@Marc बजरी के रूप में उसकी टिप्पणी में बताया), जब App.xaml बनाया गया है और/मी स्विच सी # संकलक प्रवेश बिंदु के रूप में उस वर्ग का उपयोग करने के लिए निर्दिष्ट किया जाता है Main() स्वचालित रूप से उत्पन्न होता है। यदि आप प्रोजेक्ट गुणों को देखते हैं, तो आपको स्टार्टअप ऑब्जेक्ट चुनने के लिए एक सेटिंग मिल जाएगी। तो यदि आप चाहते हैं, तो आप अपनी खुद की कक्षा प्रदान कर सकते हैं जो Main() लागू करता है।

ध्यान दें कि यह Application उदाहरण बनाने के लिए आप पर ज़िम्मेदारी रखेगा और यह सुनिश्चित करने के लिए किविधि को कॉल करें, ताकि WPF आधारभूत संरचना ठीक से शुरू हो सके।

+0

दरअसल, बिना '/ m' के * यह * देखभाल * किस प्रकार कहा जाता है; यदि आप स्पष्ट नहीं हैं तो यह ** ** किसी भी ** उपयुक्त 'मुख्य' विधि को खोजने का प्रयास करता है, और यदि शिकायतें 0 या उससे अधिक पाती हैं तो शिकायत करती है। उदाहरण के तौर पर, भाषा spec (§1.1) में "हैलो वर्ल्ड" नमूना टाइप नाम के रूप में 'हैलो' का उपयोग करता है। –

+1

पेडेंटिक होने के लिए: यह कहना सही नहीं है कि 'मुख्य() 'सीएलआर (रनटाइम) द्वारा प्रदान किया जाता है, यह वास्तव में संकलक है जो इसे उत्पन्न करता है। –

+0

दर्शकों को याद दिलाने के लिए मेरा +1 जोड़ा गया है, उन्हें अपने स्वयं के एप्लिकेशन इंस्टेंस (यानी 'MyApp.App ऐप = नया MyApp.App();') में जोड़ना होगा और पिछले पर की तरह '.Run() 'पर कॉल करें। 'मुख्य()' होगा। अच्छा निर्णय। साथ ही, 'app.InitializeComponent(); 'app.Run()' से पहले, और सौभाग्य से हमारे लिए, मूल' InitializeComponent() 'विधि अभी भी है (App.g.cs में देखा गया है, इसलिए नहीं) उसे वापस जोड़ने की जरूरत है!)। – vapcguy

66

मुख्य() विधि स्वचालित रूप से बनाया जाता है। आप अपने खुद के आप के लिए है प्रदान करना चाहते हैं (VS2013 और VS2017 में परीक्षण किया गया):

  • राइट-क्लिक करें समाधान एक्सप्लोरर में App.xaml, चुनें गुण
  • 'पेज' के लिए
  • बदलें 'एक्शन का निर्माण' (प्रारंभिक मान 'एप्लिकेशनडिफिनिशन' है)

फिर App.xaml.cs. में एक मुख्य() विधि जोड़ें। यह इस तरह से हो सकता है:

[STAThread] 
public static void Main() 
{ 
    var application = new App(); 
    application.InitializeComponent(); 
    application.Run(); 
} 
+10

बिल्ड एक्शन टिप कुंजी थी, धन्यवाद – joshcomley

+3

बहुत बढ़िया! स्वीकृत उत्तर होना चाहिए। – Jack

+1

'[STAThread]' क्या है? मैं भी एक नौसिखिया हूं और मुझे नहीं पता ... – Jepessen

0

मैं फ़ाइलों है कि एक और परियोजना है कि एक नया एक में एक MainWindow बिना किया गया था और यह त्रुटि आई में लोड नहीं होगा की नकल की।

एक खिड़की फ़ाइल इस फ़ाइल की स्टार्टअप uri बनाने और स्थापित करने के बाद मैं App.xaml की ApplicationDefinition को पृष्ठ बंद संपत्ति 'एक्शन बनाएं':

मेरे लिए यह एंड्रियास Kahler के विपरीत दृष्टिकोण तय करने के लिए कर रही है ले लिया।

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