WPF में कोई मुख्य () नहीं?


128

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


13
आप App.xaml.cs. में OnStartup को ओवरराइड करके समान कार्यक्षमता प्राप्त कर सकते हैं। StartupEventArgs.Args में कमांडलाइन तर्क होते हैं।
Foole

1
@ फ़ोलो, नहीं, आप यह प्रश्न नहीं देख सकते ।
२१ बजे सिनट्रैट

जवाबों:


73

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

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();
        }
    }
}

1
वही चीज मौजूद है App.g.cs, साथ ही साथ। लेकिन मैंने Main()अपने प्रोजेक्ट को फिर से बनाने और जोड़ने की कोशिश की , यह आपके पास, यहाँ क्या है, इसे वापस करेगा। किसी अन्य वर्ग में अपना स्वयं का बनाने की कोशिश की, लेकिन प्रोजेक्ट गुण केवल MyProject.App को ढूँढता है, अन्य वर्ग को नहीं, इसलिए इसे पुनर्निर्देशित नहीं कर सकता है।
वाप्गुगी

1
वैकल्पिक रूप से, App.xaml.csदृश्य स्टूडियो में खोलें । नेविगेशन बार> विधि ड्रॉप डाउन सूची> चयन Main(ग्रेयर्ड आउट) का उपयोग करें। यह आपको ले जाता है App.g.i.cs
पी। ब्रायन। मैके

136

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

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

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

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

2
[STAThread] आपके एप्लिकेशन के लिए COM थ्रेडिंग मॉडल सेट करता है। आमतौर पर आप इसे सिर्फ STA पर सेट करते हैं और चिंता करने की ज़रूरत नहीं है कि यह वास्तव में क्या करता है। यदि आप रुचि रखते हैं, तो msdn.microsoft.com/de-de/library/…
Andreas Kahler

यह मत करो! यह स्थायी रूप से पूरे प्रोजेक्ट के लिए डिज़ाइनर में स्टाइल्स में App.xaml में परिभाषित StaticResources तोड़ देगा।
१६:२० बजे हिमबीर

13

Main() सीएलआर और डब्ल्यूपीएफ द्वारा स्वचालित रूप से प्रदान किया जाता है।

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

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

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


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

2
पांडित्यपूर्ण होने के लिए: यह कहना सही नहीं है कि main()सीएलआर (रनटाइम) द्वारा प्रदान किया गया है, यह वास्तव में संकलक है जो इसे उत्पन्न करता है।
हांक

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

7

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


6

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

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


1

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

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

एक विंडो फ़ाइल बनाने और स्टार्टअप यूरी को इस फ़ाइल में सेट करने के बाद मैंने पृष्ठ को AppDefinition of App.xaml 'Build Action' की संपत्ति में बदल दिया।


0

यदि आपने डिफ़ॉल्ट App.xaml और MinWindow.xaml को हटा दिया है, तो संपादित करने के लिए बेहतर है .csproj मैन्युअल रूप से App.xaml जोड़ने के बाद, आपका .csproj होगा:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

इसे इसमें बदलें:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.