2012-02-28 10 views
61

नेट लाइब्रेरी में कई विधियां मूल कोड में लागू की गई हैं। ढांचे से आने वाले लोग [MethodImpl(MethodImplOptions.InternalCall)] के साथ चिह्नित हैं। कुछ अप्रबंधित डीएलएल से आने वाले लोग [DllImport] (उदा। [DllImport("kernel32.dll")]) के साथ चिह्नित हैं। अभी तक असामान्य कुछ भी नहीं।[DllImport ("QCall")] क्या है?

लेकिन answer for another question लिखते समय, मैंने पाया कि [DllImport("QCall")] के साथ चिह्नित कई विधियां हैं। वे .NET के आंतरिक कार्यान्वयन प्रतीत होते हैं (उदा। GC._Collect())।

मेरा प्रश्न है: [DllImport("QCall")] का क्या अर्थ है? [DllImport("QCall")] और [MethodImpl(MethodImplOptions.InternalCall)] के बीच क्या अंतर है?

+1

यह एक विशेष आंतरिक कॉल है; मैं विवरण खोजने की कोशिश कर रहा हूं। – SLaks

+0

मुझे कुछ समय पहले पढ़ना याद है कि "क्यूकॉल" clr.dll का हिस्सा है। हालांकि, मैं उससे परे बहुत कुछ नहीं जानता। एक उत्कृष्ट प्रश्न के लिए +1। – ahawker

+11

यह एक .NET 4 विशिष्ट सुविधा है। आप V4 संदर्भ स्रोत से अंतर्दृष्टि प्राप्त कर सकते हैं, System.Runtime.CompilerServices.Jithelpers.cs के लिए स्रोत कोड देखें। स्ट्रिंग clr.dll में दो बार दिखाई देती है, जैसे __IsQCall और एक इनलाइन शाब्दिक के रूप में। यह दृढ़ता से MethodImplOptions.InternalCall से परे एक विस्तार तंत्र जैसा दिखता है, साबित करता है कि सीएलआर स्रोत कोड के बिना यह मुश्किल है। –

उत्तर

14

यह एक पुराना धागा है। चूंकि CoreCLR अब गिटहब पर खुलासा हुआ है; अगर किसी को अभी भी इस सवाल का जवाब मांग कर रहा है, यहाँ official documentation है:

Calling from managed to native code

हम प्रबंधित कोड से CLR में फोन करने के लिए दो तकनीकों की है। एफसीएल आपको सीएलआर कोड में सीधे कॉल करने की अनुमति देता है, और ऑब्जेक्ट्स में हेरफेर करने के मामले में बहुत लचीलापन प्रदान करता है, हालांकि ऑब्जेक्ट संदर्भों को सही तरीके से ट्रैक न करके जीसी छेद का कारण बनना आसान है। क्यूकॉल आपको पी/इनवॉक के माध्यम से सीएलआर में कॉल करने की अनुमति देता है, और एफकॉल की तुलना में गलती से गलत उपयोग करने के लिए बहुत कठिन है। FCalls को प्रबंधित कोड में MethodImplOptions.InternalCall बिट सेट के साथ बाहरी विधियों के रूप में पहचाना जाता है। क्यूकॉल स्थिर बाहरी विधियां हैं जो नियमित पी/आमंत्रण की तरह दिखती हैं, लेकिन "क्यूकॉल" नामक लाइब्रेरी में दिखाई देती हैं।

बहु-आयामी सरणी तत्वों, रेंज चेक इत्यादि जैसे चीजों को करने के लिए जेआईटी हेल्पर्स को लागू करने के लिए एचसीएल (हेल्पर कॉल के लिए) नामक एफसीएल का एक छोटा सा संस्करण है। एचसीएल और एफकॉल के बीच एकमात्र अंतर यह है कि एचकॉल विधियां अपवाद स्टैक ट्रेस में दिखाई नहीं देगा।

और फिर यह subheadings में जारी है:

उदाहरण के साथ

:

35

मैंने इस बारे में .Net टीम में कुछ लोगों से पूछा।

क्यूकॉल सीएलआर रनटाइम के भीतर मूल तरीकों से कॉल कर रहे हैं। वे अन्य [DllImport] एस की तरह व्यवहार करते हैं, लेकिन वे तेज़ होते हैं क्योंकि वे मूल विधियों के बारे में विशिष्ट (अनियंत्रित) धारणाएं करते हैं, इसलिए वे विभिन्न मार्शलिंग और जीसी और अपवाद जांच को छोड़ सकते हैं।

InternalCall अलग है; यह विशेष प्रतिबिंब-शैली की चीजों के लिए कॉल के लिए है जो रनटाइम पर उत्पन्न होते हैं (यह बहुत स्पष्ट नहीं था)।

0

@ एसएलएक्स उत्तर का पूरक, MethodImplOptions.InternalCall संक्षिप्त रूप से यहां वर्णित है: ThreadPoolPriority, and MethodImplAttribute

असल में आंतरिक कॉल रनटाइम को नामित कार्यों की अपनी आंतरिक लुकअप तालिका जांचने के लिए कहता है। रनटाइम कोड में स्रोत फ़ाइल के कारण वह तालिका मौजूद है जब रनटाइम संकलित होने पर उन्हें स्पष्ट रूप से घोषित किया जाता है। यह सब आंतरिक कॉल लागू करने के लिए समारोह संकेत की एक सूची है:

static ECFunc gGuidFuncs[] = { {FCFuncElement("CompleteGuid", NULL, (LPVOID)GuidNative::CompleteGuid)}, {NULL, NULL, NULL} }; 

इस घोषणा क्रम कि कामयाब Guid.CompleteGuid विधि के लिए विधि शरीर वास्तव में देशी सी ++ GuidNative :: CompleteGuid समारोह है बताता है। यह लेख इस जगह पर मार्शलिंग कैसे काम करता है इस पर बहुत स्पष्ट नहीं है, लेकिन सामान्य रूप से यह रनटाइम कार्यान्वयन के लिए स्पष्ट रूप से है, क्योंकि यह दोनों ए) फंक्शन बॉडी घोषित करता है [जो मार्शल प्रारूप पर निर्भर करता है] और बी) क्या किसी भी आवश्यक मार्शलिंग ।

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