इन तरीकों के कार्यान्वयन को देखने के लिए आपको सीएलआर के लिए स्रोत कोड की आवश्यकता होगी। यह आना मुश्किल है, माइक्रोसॉफ्ट इसे प्रकाशित नहीं करता है और यह संदर्भ स्रोत द्वारा कवर नहीं है।
जब तक विधि "पुरानी" है, तब तक .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 संस्करण है, डेस्कटॉप संस्करण स्रोत अभी भी बंद-स्रोत है। हालांकि दो संस्करणों में आम तौर पर बहुत अधिक संभावना है।
आपको अंतर्निहित सी कोड देखना होगा। यह ढांचे के बीच अलग-अलग संभाला जाता है, यानी सामान्य बनाम सूक्ष्म। – leppie
आप सीएलआर के कई टुकड़ों के लिए माइक्रोसॉफ्ट से "साझा स्रोत" प्राप्त कर सकते हैं। मैंने जांच नहीं की है, लेकिन मुझे लगता है कि 'System.String' कार्यान्वयन को शामिल किया जाना चाहिए - दोनों प्रबंधित और देशी भागों। विवरण के लिए http://referencesource.microsoft.com/ देखें –
@BenVoigt आपकी जानकारी के लिए धन्यवाद। मुझे माइक्रोसॉफ्ट से स्रोत मिलता है, और स्ट्रिंग की स्रोत फ़ाइल में, इसमें निम्नलिखित टिप्पणियां हैं: '** उद्देश्य: आपकी पसंदीदा स्ट्रिंग क्लास। मूल विधियां ** StringNative.cpp' में लागू की गई हैं। हालांकि, ऐसा लगता है कि एमएस ने इस फाइल को सार्वजनिक नहीं किया था। – 2power10