2013-06-19 11 views
6

यह प्रश्न इस एप्लिकेशन को पुनरारंभ करने के तरीके के बारे में नहीं है। मैं पहले से ही एक म्यूटेक्स और माध्यमिक स्टार्टर एप्लिकेशन का उपयोग करके प्राप्त कर रहा हूं। आवेदन का उपयोग कर कुछ समस्याओं का सामना करने के बाद मुझे इसका सहारा लेना पड़ा। रीस्टार्ट।एप्लिकेशन कैसे करता है। रीस्टार्ट .NET में काम करता है?

किसी भी मामले में, आईएल के साथ धाराप्रवाह नहीं होने पर, मैं सोच रहा था कि कोई यह बता सकता है कि एप्लिकेशन कैसे। रीस्टार्ट पहली जगह काम करता है। यह रनटाइम के लिए एक कॉल है लेकिन रनटाइम वास्तव में क्या करता है? यह मौजूदा उदाहरण को कैसे बंद करता है और यह कैसे पता चलता है कि नया लॉन्च कब करें?

उत्तर

8

... आईएल के साथ धाराप्रवाह नहीं किया जा रहा, ...

आप एक decompiler (परावर्तक, dotPeek) या और भी बेहतर उपयोग करते हुए विचार किया है, नेट ढांचे के reference source कोड?

वैसे भी।

एक आकस्मिक नज़र में यह निम्नलिखित है:

  • मामलों से नीचे के सभी में, वर्तमान उदाहरण Application.ExitInternal() का उपयोग कर समाप्त हो जाता है। यह सार्वजनिक सुरक्षा Application.Exit() विधि का सारांश है, कुछ सुरक्षा जांच/आवेषण को छोड़कर।

  • देखें कि यह Assembly.GetEntryAssembly() निर्धारित कर सकता है या नहीं। यदि वह null है तो Application.Restart() कॉल को अप्रबंधित कोड से संभवतः किया गया था और ऑपरेशन कॉलर को NotSupportedException फेंकता है।

  • देखें कि वर्तमान प्रक्रिया ieexec.exe है, यदि ऐसा है तो एप्लिकेशन को पुनरारंभ करने के लिए इसका उपयोग करें (ieexec.exe के बारे में अधिक जानकारी के लिए here देखें)। असल में यह Process.Start() पर भी ieexec.exe पर कॉल करता है, लेकिन कमांड लाइन तर्क Environment.GetCommandLineArgs() (नीचे देखें) द्वारा एकत्र नहीं किए जाते हैं, लेकिन APP_LAUNCH_URL एप्लिकेशन डोमेन डेटा पढ़कर।

  • देखें कि एप्लिकेशन एक क्लिक-वन एप्लिकेशन (ApplicationDeployment.IsNetworkDeployed) है, यदि ऐसा है तो एक सीएलआर आंतरिक देशी कोड (पुनः) लॉन्च करने के लिए कॉल करें: CorLauncApplication। सीएलआर के देशी हिस्सों जैसा कुछ हद तक सार्वजनिक रूप से उपलब्ध स्रोत कोड साझा स्रोत सीएलआई (एसएसक्ली) है, जो .NET 2.0 ढांचे पर आधारित है और यह आंशिक रूप से अपूर्ण है। इसमें उस फ़ंक्शन (clr\src\vm\hosting.cpp) की परिभाषा शामिल है, लेकिन यह केवल एक स्टब है। अंत में यह प्रक्रिया को पुनरारंभ करने के लिए कुछ साधनों का उपयोग करेगा (उदा। Win32's CreateProcess API)।

  • अन्य: एप्लिकेशन एक "नियमित" .NET एप्लिकेशन है। Environment.GetCommandLineArgs() का उपयोग मूल कमांड लाइन को फिर से बनाने के लिए किया जाता है और Process.Start(Application.ExecutablePath) एप्लिकेशन को पुनरारंभ करने के लिए उपयोग किया जाता है।

Application.Exit -mechanism के उपयोग को समाप्त करने के वर्तमान उदाहरण शायद कारण है कि आप इसे अविश्वसनीय लगता है की कोशिश करना। फॉर्म जो समापन समापन घटना को रद्द करते हैं, इसे बाधित कर सकते हैं। this SO प्रश्न भी देखें।

+0

बह, आपका उत्तर मेरे मुकाबले इतना बेहतर है, मैं भी अपना नाम हटा सकता हूं :(। आपको अच्छा सर! –

+0

@ ईसाई.के: 'प्रोसेस.स्टार्ट (एप्लिकेशन.एक्सटेबल पाथ)' कौन कहता है – joe

+0

@joe थ्रेड जिसे 'एप्लिकेशन। रीस्टार्ट()' कहा जाता है, यह आखिरी चीज है जो फ़ंक्शन लौटने से पहले करता है। –

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