2012-03-18 5 views
8

मैं गतिशील तरीकों से प्रतिबिंबित सी # कोड में थोड़ा सा आया हूं, और मुझे अभी पता नहीं है कि वे क्या हैं। विशेष रूप से DynamicMethod वर्ग लगता है जो रनटाइम पर सीएलआर विधियों की पीढ़ी और विनिर्देश की अनुमति देता है। लेकिन फिर MethodBuilder कक्षा भी है। वे दोनों बहुत ही समान चीजें करते हैं। स्पष्ट रूप से "गतिशील असेंबली" AssemblyBuilder कक्षाएं और "गतिशील प्रकार" TypeBuilder कक्षाएं हैं। वे सभी किसी भी मामले में System.Reflection.Emit नामस्थान में रहते हैं।डायनामिक विधियां क्या हैं और डायनामिक मोडर विधिबिल्डर से अलग कैसे है?

MSDN इस विषय पर कीमती थोड़ा उच्च स्तरीय जानकारी नहीं है लगता है। तो अगर कोई यह बता सकता है कि गतिशील तरीके क्या हैं, जहां वास्तव में सभी XYZBuilder कक्षाएं यहां खेलती हैं, और वे प्रत्येक के लिए क्या उपयोग की जाती हैं, तो यह बहुत अच्छा होगा। कोई अन्य प्रतिबिंब। प्रवेश प्रकार और कार्यक्षमता मुझे पता होना चाहिए कि भी सराहना की जाएगी।

उत्तर

9

मुझे लगता है कि यह अच्छी तरह से the documentation for DynamicMethod बताते हैं:

आप एक गतिशील विधानसभा और विधि को रोकने के लिए एक गतिशील प्रकार उत्पन्न करने के लिए बिना, पैदा करते हैं और रन टाइम पर एक विधि पर अमल करने DynamicMethod वर्ग का उपयोग कर सकते हैं। DynamicMethod ऑब्जेक्ट पर पुनः दावा किए जाने पर केवल इन-टाइम (जेआईटी) कंपाइलर द्वारा बनाए गए निष्पादन योग्य कोड को पुनः दावा किया जाता है। गतिशील विधियां कोड की थोड़ी मात्रा उत्पन्न करने और निष्पादित करने का सबसे प्रभावी तरीका हैं।

यदि आपको गतिशील रूप से एक या अधिक विधियां बनाने की आवश्यकता है, तो DynamicMethod का उपयोग करें। आप पूरे प्रकार बनाने के लिए चाहते हैं, यह आप तो यह (ModuleBuilder) के अंदर एक मॉड्यूल बनाने और उसके बाद एक या अधिक प्रकार (TypeBuilder) बनाने के लिए एक गतिशील विधानसभा (AssemblyBuilder) बनाने की जरूरत है, जिसका अर्थ। उन प्रकारों के अंदर विधियों को बनाने के लिए, आप MethodBuilder का उपयोग करेंगे।

एक और अंतर यह है जीसी: DynamicMethod रों हमेशा कचरा एकत्र और वे एक के बाद एक एकत्र कर रहे हैं हो सकता है। यही है, जैसे ही आप इसे इस्तेमाल करना बंद कर देते हैं, किसी भी विधि को एकत्रित किया जा सकता है। दूसरी ओर, गतिशील असेंबली केवल तभी एकत्र की जा सकती है जब आप इसे निर्दिष्ट करते हैं (AssemblyBuilderAccess.RunAndCollect का उपयोग करके) और वे हमेशा असेंबली द्वारा असेंबली एकत्रित होते हैं। उदाहरण के लिए, यदि आपके पास असेंबली में दो प्रकार हैं, और आप उनमें से केवल एक का उपयोग करते हैं, तो दूसरा एकत्र नहीं किया जा सकता है।

+0

दोह। एमएसडीएन पृष्ठों को इतनी देर से पढ़ते समय मुझे यह याद करना होगा। धन्यवाद। – Noldorin

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