2012-10-01 34 views
5

मैं समझने के लिए सर्वव्यापी JIT इनलाइन किए जाने वाले हो सकते हैं करना चाहते हैं।क्या यह संभव है JIT इनलाइन किए जाने वाले कुछ .NET रनटाइम विधानसभा कोड में मेरी कोड इनलाइन करने के लिए?

मान लीजिए कि मेरे कोड में मैं System.IO असेंबली कहने से कुछ फ़ंक्शन कॉल करता हूं और System.IO फ़ंक्शन के अंदर से कॉल करने के लिए मेरे कोड में लागू फ़ंक्शन के कॉलबैक संदर्भ को पास करता हूं। मेरे फ़ंक्शन में GetCallingAssembly() कॉल है। तो अगर मेरा कॉलबैक System.IO में GetCallingAssembly() पर कॉल किया गया है जो मूल रूप से मेरे कोड में था और यह कहने का इरादा था कि "वर्तमान" विधि System.IO के अंदर से कहा जाता है तो यह कहता है कि अब इसे मेरे कोड के अंदर से बुलाया गया है।

ऐसे इनलाइनिंग संभव है या .NET रनटाइम विधानसभाओं अलग तरह से व्यवहार कर रहे हैं ताकि .NET रनटाइम कोड में उपयोगकर्ता कोड की कि JIT इनलाइनिंग अनुमति नहीं है?

+1

कैसे एक प्रतिनिधि कॉलबैक कभी कॉलबैक-invoker को inlined जायेगा? मुझे यकीन नहीं है कि समझ में आता है ...? मेरी समझ यह है कि इनलाइनिंग उन परिदृश्यों तक ही सीमित है जहां कोड लागू किया जाना ** ** प्रबल ** है - यानी एक स्थैतिक कॉल, या गैर-आभासी विधि के लिए वर्चुअल-कॉल। –

+0

@Mark बजरी: क्यों यह पूरे कार्यक्रम में कॉलबैक invoker का केवल invokation होने के लिए पता नहीं कर सके, तो है? – sharptooth

+0

मैं * संदिग्ध * जेआईटी की तुलना में समझने के लिए और अधिक प्रयास करना है, खासकर जब प्रतिबिंब/मेटा प्रोग्रामिंग मौजूद है (अर्थात्: नए कॉलर बाद में मौजूद हो सकते हैं) –

उत्तर

3

आप कॉलबैक सुरक्षित रूप से ग्रहण कर सकते हैं inlined नहीं किया जाएगा। .NET Framework assemblies हमेशा इंस्टॉल समय पर ngen.exe द्वारा पूर्व-jitted हैं, बाद में उस कोड को बदलने के लिए कोई विकल्प नहीं है। इसके अलावा, एक प्रतिनिधि के माध्यम से कॉलबैक कभी भी रेखांकित नहीं होते हैं, भले ही जिटर ऑप्टिमाइज़र प्रतिनिधि की लक्ष्य विधि को कम कर सके।