2016-01-27 6 views
6

मेरे पास एक asp.net एप्लिकेशन है, जो क्रैश हो रहा है।क्या क्लियर कॉलस्टैक में इंटरफ़ेस देखना सामान्य है?

Exception type: EntryPointNotFoundException 
    Exception message: Entry point was not found. 
    at ***.Interfaces.Portal.Repository.ILookup.get_LookupDataCollection() 
    at ***.Portal.Repository.Lookup.GetLookUpValue(ILookup lookup, Int32 index) 
    at ***.Portal.Repository.Lookup.GetLookUpValue(ILookup lookup) 
    at ***.HttpModules.RuntimeHttpModule.SetPageUrlInfoInContext(PageUrlInfo pinfo) 
    at ***PortalRuntime.HttpModules.RuntimeHttpModule.BeginRequest(Object sender, EventArgs e) 
    at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

यह केवल एक ग्राहक मशीन पर होता है और मैं इसे स्थानीय स्तर पर पुन: पेश करने में सक्षम नहीं था: वहाँ खिड़कियों घटना लॉग जो इस callstack शामिल में इस के लिए एक प्रवेश है। जैसा कि आप शीर्ष पर देखते हैं वहां एक इंटरफ़ेस है (ILookup, जो वास्तव में एक इंटरफ़ेस है, कक्षा नहीं है)।

मैंने एक समान नमूना बनाया (विधि को इंटरफ़ेस के माध्यम से बुलाया गया)। विजुअल स्टूडियो 2015 बहुत चालाक इस दिखाने के लिए है:

ConsoleApplication2.exe!ConsoleApplication2.Lookup.GetLookupId(ConsoleApplication2.ILookup lookup) Line 37 C# 

लेकिन वहाँ आप अभी भी वर्ग है जो विधि को लागू करता है देखते हैं। मैंने विंडबग के साथ अपने नमूने से भी जुड़ा हुआ और स्टैक मुद्रित किया जब एप्लिकेशन इंटरफ़ेस के माध्यम से बुलाए गए विधि में ब्रेकपॉइंट में बैठता है: इंटरफ़ेस स्टैक पर नहीं था।

  • यह (विशेष रूप से वर्ग है जो इसे लागू करता है) के बिना एक clr callstack में एक इंटरफेस को देखने के लिए सामान्य है:

    यहाँ मेरे सवाल है? मुझे लगता है कि मैंने कभी ऐसा कॉलस्टैक कभी नहीं देखा है ... कोई और? (मैं सामान्य रूप में यह मतलब है, मेरे सवाल के दूसरे भाग की परवाह किए बिना)

  • Here काफ़ी मिलती-जुलती सवाल यह है: अपनी पहली टिप्पणी में @Hans Passant कहते हैं, "एक अंतरफलक विधि के लिए क्रियान्वयन विधि को हल करने के लिए विफलता" और ओपी का कहना है कि "आपने पहले ही अपनी टिप्पणी के साथ अपने प्रश्न का उत्तर दिया है"। तो क्या यह वास्तव में मूल कारण है? क्या किसी को इसके लिए एक फिक्स के बारे में पता है? या यह सिर्फ एक विशेष सीएलआर संस्करण है?

उत्तर

7

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

समस्या यह है कि जिटर को उस विधि के लिए कोड जेनरेट करना होगा जिसमें इंटरफ़ेस विधि कॉल शामिल है। लेकिन यह अभी तक ऑब्जेक्ट संदर्भ की पहचान नहीं जान सकता है। कोड वास्तव में निष्पादित होने तक 100% सटीक नहीं है। तो यह क्या करता है स्टब, लक्ष्य विधि के लिए एक स्थान धारक आवंटित करता है। और उस स्टब को कॉल निर्देश उत्पन्न करता है। उस स्टब विधि का वास्तविक नाम प्रासंगिक नहीं है, वास्तविक लक्ष्य विधि हल होने पर यह फिर से गायब होने जा रहा है।

स्टब स्वयं लक्ष्य विधि को हल करने के लिए सीएलआर में एक कॉल उत्पन्न करता है, अब ऑब्जेक्ट संदर्भ की वास्तविक पहचान को जानना और इस प्रकार किस विशिष्ट कार्यान्वयन विधि को निष्पादित करने की आवश्यकता है। और मशीन कोड को पैच करता है ताकि कॉल पता बदल दिया जा सके। तो अगले समय विधि निष्पादित करता है कि आप विधि बाध्यकारी की कीमत का भुगतान नहीं करते हैं और कॉल अधिकतम संभव वार गति पर चलता है।

जैसा कि ध्यान दिया गया है, स्टब का नाम कोई फर्क नहीं पड़ता क्योंकि यह अस्थायी है। इसे इंटरफ़ेस विधि का नाम देना बहुत एक MissingMethodException का निदान करने में सहायक है। अच्छा विचार।

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

+0

स्पष्टीकरण के लिए बहुत धन्यवाद! यह स्पष्ट करता है कि हम स्टैक के शीर्ष पर इंटरफ़ेस क्यों देखते हैं। शायद एक टिप्पणी: "और मशीन कोड पैच करता है ताकि कॉल पता बदल दिया जा सके। तो अगली बार जब विधि निष्पादित होती है तो आप बाध्यकारी विधि की कीमत का भुगतान नहीं करते हैं "हां, लेकिन अगर अगली बार विधि को किसी अन्य प्रकार से बुलाया जाता है, जो इंटरफ़ेस लागू करता है? Jitted कोड में एक कार्यान्वयन के लिए एक फिक्स कॉल नहीं हो सकता है। लेकिन वैसे भी, मैं आपके बिंदु को समझता हूं। एक बार फिर धन्यवाद! – gregkalapos

+0

हाँ, यही वह हिस्सा है जिसके बारे में मुझे पर्याप्त जानकारी नहीं है। यह काम करता हैं। –

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