2010-05-02 22 views
9

मैं रनटाइम पर किसी निश्चित वर्ग में कुछ व्यवहार जोड़ना चाहता हूं। मुझे पता है कि प्रतिबिंब का उपयोग करके रनटाइम पर उप-वर्ग कैसे करें। स्वीकार करें लेकिन यह पर्याप्त नहीं है, कुछ बाहरी कॉन्फ़िगरेशन के आधार पर मुझे एक प्रकार टी पर किसी विधि में ऑपकोड इंजेक्ट करने की आवश्यकता है, इसलिए इससे प्राप्त होने वाले सभी वर्ग स्वचालित रूप से इस व्यवहार को प्राप्त करते हैं। (मैं इसका उपयोग नहीं कर सकता .NET प्रोफाइलिंग API)क्या Mono.Cecil AppDomain में पहले से लोड कोड को संशोधित कर सकता है?

ऐसा कुछ मोनो सेसिल के साथ किया जा सकता है? सेसिल?

यदि लोड किए गए असेंबली पर कोड को संशोधित करना संभव नहीं है, तो यह ठीक है अगर मैं असेंबली लोड होने से पहले संशोधन कर सकता हूं और फिर संशोधित असेंबली को स्मृति में लोड कर सकता हूं, लेकिन मुझे नहीं पता कि मैं असेंबली लोडिंग को कैसे नियंत्रित कर सकता हूं।

+0

क्या आप पूछ रहे हैं क्योंकि आप कोड को अनुकूलित करना चाहते हैं? क्या आप उपकरण के विकल्प के रूप में नमूनाकरण के विचार के लिए खुले हैं? कई लोग वाद्ययंत्र में विश्वास करते हैं क्योंकि यह "सटीक" है, जो आपको अनुकूलन के लिए आवश्यक नहीं है। यदि आप अनुकूलित करना चाहते हैं, तो इस विधि पर विचार करें: http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024 –

+0

इसका अनुकूलन नहीं है मैं देख रहा हूं, मैं जो चाहता हूं वह कॉन्फ़िगरेशन के आधार पर ढांचे में कुछ व्यवहार जोड़ना है। उदाहरण के लिए, टाइप डिस्क्रिप्टर निरीक्षण तंत्र लें, अगर मैं कुछ कॉन्फ़िगरेशन पढ़ता हूं और बेस क्लास टी में कुछ सार्वजनिक संपत्ति जोड़ता हूं, तो जो भी टाइप डीस्क्रिप्टर तंत्र का उपयोग कर टी या उसके किसी भी उप-वर्ग का निरीक्षण करता है, वह संपत्ति देखेगा, लेकिन यदि एक ही निरीक्षण किया जाता है प्रतिबिंब का उपयोग कर संपत्ति गायब हो जाएगी। Thats क्योंकि प्रकार वास्तव में संशोधित नहीं है, संपत्ति सिर्फ टाइपडिस्क्रिप्टर निरीक्षण के संदर्भ में जोड़ा गया है। –

उत्तर

6

नहीं, सेसिल एक लोड असेंबली को संशोधित नहीं कर सकता है। वास्तव में लोड होने से पहले आपको असेंबली उपकरण बनाना होगा।

आपके पास असेंबली कैसे हल की जाती है इस पर अधिक नियंत्रण नहीं है। आप AppDomain.Assembly में घुस सकते हैं अगर आप अपने निजी फ़ोल्डर में असेंबली छुपाते हैं, और उपकरण लोड करने से पहले उपकरण को छिपाते हैं।

+0

मुझे जो चाहिए वह है, मुझे इस घटना के बारे में पता नहीं था, धन्यवाद। –

1

जैसा कि जेबी ऊपर बताता है- आप एक संकल्प इवेंट हैंडलर बना सकते हैं - जो PSeudoHooking की तरह होगा। और असेंबली लोड होने से पहले, आप अपने परिवर्तन करते हैं, और फिर एक बार परिवर्तन किए जाने के बाद, संकल्प हल करने के बाद विधानसभा को हल करना जारी रहता है।

मैं मेमोरी स्ट्रीम से एंबेडेड डीएल को हल करने के लिए इस विधि का उपयोग करता हूं।