2013-05-16 16 views
15

उपयोग ILSpy System.String के कोड की जांच करने के दौरान, मैंने पाया जैसे MethodImplOptions.InternalCall के रूप में चिह्नित कुछ तरीकों देखते हैं:विधि के कोड को कैसे देखें जिसे MethodImplOptions.InternalCall के रूप में चिह्नित किया गया है?

[SecurityCritical] 
[MethodImpl(MethodImplOptions.InternalCall)] 
internal static extern int nativeCompareOrdinalEx(string strA, int indexA, string strB, int indexB, int count); 

मैं जानता हूँ कि MethodImplOptions.InternalCall इस विधि का मतलब है आम भाषा से मूल रूप से कार्यान्वित किया जाता है प्रदर्शन को बेहतर बनाने के लिए अनुकूलित कोड को रनटाइम।

मेरा प्रश्न है: क्या यह वैसे भी हमें MethodImplOptions.InternalCall के रूप में चिह्नित कोड देखने में सक्षम बनाता है?

+3

आपको अंतर्निहित सी कोड देखना होगा। यह ढांचे के बीच अलग-अलग संभाला जाता है, यानी सामान्य बनाम सूक्ष्म। – leppie

+0

आप सीएलआर के कई टुकड़ों के लिए माइक्रोसॉफ्ट से "साझा स्रोत" प्राप्त कर सकते हैं। मैंने जांच नहीं की है, लेकिन मुझे लगता है कि 'System.String' कार्यान्वयन को शामिल किया जाना चाहिए - दोनों प्रबंधित और देशी भागों। विवरण के लिए http://referencesource.microsoft.com/ देखें –

+1

@BenVoigt आपकी जानकारी के लिए धन्यवाद। मुझे माइक्रोसॉफ्ट से स्रोत मिलता है, और स्ट्रिंग की स्रोत फ़ाइल में, इसमें निम्नलिखित टिप्पणियां हैं: '** उद्देश्य: आपकी पसंदीदा स्ट्रिंग क्लास। मूल विधियां ** StringNative.cpp' में लागू की गई हैं। हालांकि, ऐसा लगता है कि एमएस ने इस फाइल को सार्वजनिक नहीं किया था। – 2power10

उत्तर

3

अब से CoreCLR is open source, इसलिए हम आंतरिक कोड देख सकते हैं।

आंतरिक कार्यान्वयन देखने के लिए आप stringnative.cpp में COMString::CompareOrdinalEx कीवर्ड खोज सकते हैं।

12

इन तरीकों के कार्यान्वयन को देखने के लिए आपको सीएलआर के लिए स्रोत कोड की आवश्यकता होगी। यह आना मुश्किल है, माइक्रोसॉफ्ट इसे प्रकाशित नहीं करता है और यह संदर्भ स्रोत द्वारा कवर नहीं है।

जब तक विधि "पुरानी" है, तब तक .NET 2.0 के बाद उपलब्ध है, तो आपके पास SSCLI20 source code से एक शॉट होगा। गैर-शून्य जोखिम के साथ आप पाठ्यक्रम के पुराने संस्करण को देख रहे होंगे। लेकिन यह समझने के लिए काफी अच्छा है कि यह कैसा दिखता है और अक्सर अभी भी सटीक है।

कोड के लिए खोज शुरू करने के लिए प्रारंभिक बिंदु clr/src/vm/ecall.cpp स्रोत कोड फ़ाइल है। इसमें सारणी होती है जो जिटर आंतरिक तरीकों की खोज करता है। अनुभाग कि nativeCompareOrdinalEx() के लिए प्रासंगिक है इस तरह दिखता है:

FCFuncStart(gStringFuncs) 
    FCDynamic("FastAllocateString", CORINFO_INTRINSIC_Illegal, ECall::FastAllocateString) 
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_ArrChar_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharArrayManaged) 
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_ArrChar_Int_Int_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharArrayStartLengthManaged) 
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_PtrChar_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharPtrManaged) 
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_PtrChar_Int_Int_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharPtrStartLengthManaged) 
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_Char_Int_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharCountManaged) 

    FCFuncElement("nativeCompareOrdinal", COMString::FCCompareOrdinal)  // <=== Here 
    FCFuncElement("nativeCompareOrdinalWC", COMString::FCCompareOrdinalWC) 
    FCIntrinsic("get_Length", COMString::Length, CORINFO_INTRINSIC_StringLength) 
    // etc.. 
} 

नोट कैसे FCFuncElement एक स्ट्रिंग और सी ++ विधि है कि आंतरिक कॉल को लागू करता है करने के लिए एक समारोह सूचक के रूप में विधि नाम है। स्रोत कोड पेड़ को दबाकर फिर आपको clr/src/vm/comstring.cpp पर ले जाता है। मैं सी ++ कोड के साथ सभी को नहीं बोलेगा, बस अपने लिए एक नज़र डालें।

/*================================CompareOrdinal===============================*/ 
FCIMPL3(INT32, COMString::FCCompareOrdinal, StringObject* strA, StringObject* strB, CLR_BOOL bIgnoreCase) { 
    // Yadayada 
    //... 
} 

CaseInsensitiveCompHelper() और FastCompareStringHelperAligned() एक ही स्रोत कोड फ़ाइल में क्रमश: केस-संवेदी और केस-संवेदी तुलना कार्यों की वास्तविक कार्यान्वयन पर ले जाता है के लिए खोज रहे हैं।

इस बारे में एकमात्र अन्य बात यह है कि सीएलआर संस्करण 4 ने इस तंत्र में कुछ बदलाव किए हैं। "QCall" नामक नकली डीएलएल के लिए [DllImport] विशेषता के माध्यम से कई नई आंतरिक विधियों को जोड़ना और पूरी तरह से अलग अतिरिक्त इंटरऑप तंत्र का समर्थन करना। इन अतिरिक्तताओं के स्रोत को देखने का कोई अच्छा तरीका नहीं है जो मुझे पता है।


अद्यतन: स्रोत अब CoreCLR project से उपलब्ध है। तालिका ecall.cpp से ecalllist.h में ले जाया गया था, यांत्रिकी अभी भी वही हैं। ध्यान रखें कि यह सीएलआर का .NETCore संस्करण है, डेस्कटॉप संस्करण स्रोत अभी भी बंद-स्रोत है। हालांकि दो संस्करणों में आम तौर पर बहुत अधिक संभावना है।

1

सहायता स्ट्रिंग कहता है, वे "सीएलआर में ही लागू होते हैं", इसलिए आपको इसके सी ++ स्रोतों या डिस्सेप्लर से परामर्श करने की आवश्यकता होगी।

आम तौर पर, सीएलआर इंजन वाली फ़ाइलें %WINDIR%\Microsoft.NET\Framework\<.NET engine version> फ़ोल्डर में कुछ मूल डीएलएल हैं, अधिकतर mscor*.dll और clr.dll। रूट .NET DLL, mscoree.dll, System32 में है लेकिन ऐसा लगता है कि यह केवल लॉन्चर के रूप में कार्य करता है।

चूंकि InternalCall विधि कार्यान्वयन कार्यान्वयन विवरण हैं, इसलिए कोई गारंटी नहीं है कि उन विधियों को लगातार तरीके से कार्यान्वित किया गया है, उदा।कि उनमें से कुछ वैश्विक रजिस्ट्री भी है।

उदा। डिस्सेबलिंग से पता चलता है कि .NET 4 System.String के मूल तरीकों को clr.dll में कार्यान्वित किया गया है और System.Deployment.Application.NativeMethods.IClrRuntimeInfo पर CLRRuntimeInfoImpl COM क्लास mscoreei.dll में समर्थित है, विधियों को केवल इसके आभासी कार्यों के रूप में समर्थित किया गया है।

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

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