2009-11-15 4 views
7

मैंने System.CodeDom.CodeCompileUnit का उपयोग करके गतिशील रूप से कुछ प्रकार बनाए हैं, उन्हें स्मृति में आईएल कोड में संकलित करना चाहते हैं, और उस आईएल कोड को स्मृति में लोड असेंबली में इंजेक्ट करना है - इसमें से किसी भी डिस्क को सहेजने की आवश्यकता नहीं है। शायद मेरी कहा गया योजना गलत है। उस गंतव्य को कोडकंपाइल यूनिट उदाहरण को कैसे प्राप्त करें के बारे में अन्य सुझावों के लिए खोलें।मैं कोड कैसे उत्सर्जित करता हूं और इसे एक लोड असेंबली में इंजेक्ट करता हूं?

+1

आपको पहले से लोड की गई असेंबली में प्रकारों को इंजेक्ट करने की आवश्यकता क्यों है? आप उन असेंबली में इंजेक्ट क्यों नहीं कर सकते जिन्हें आप वर्तमान में बना रहे हैं? – yfeldblum

+1

@ जस्टिस: यह एक अच्छा मुद्दा है - यह किसी भी चीज़ से अधिक जिज्ञासा है। मुझे लगता है कि अगर मुझे परिदृश्यों का सामना करना पड़ता है तो संभव है: स्मृति में काम करके असेंबली बनाने के बारे में फाइल सिस्टम अनुमतियों को कम करने के लिए; या शायद एक असेंबली में कोड इंजेक्ट करने के लिए और ऐप को पुन: संकलित करने की आवश्यकता के बिना चीजों का निरीक्षण करने के लिए गतिशील रूप से इसका आह्वान करें। –

+0

मुझे यकीन नहीं है कि ऐसा करने का कोई तरीका है। यदि वहां है, तो मैं भी जानना चाहता हूं। –

उत्तर

7

आप ICorDebug इंटरफेस का उपयोग कर मौजूदा (पहले से लोड की गई) असेंबली में कोड इंजेक्ट कर सकते हैं। इसे संपादित करें और जारी रखें।

अपने डेल्टा बाइट्स की गणना करें और ICorDebugModule2::ApplyChanges पर कॉल करें। अधिक जानकारी के लिए MDbg sample code देखें।

एक बार एक बार हम ICorDebugModule::GetEditAndContinueSnapshot और रिन का इस्तेमाल करते थे, लेकिन इन्हें अब बहिष्कृत कर दिया गया है।

अद्यतन तो आप पहले से भरी हुई विधानसभा में कोड इंजेक्शन लगाने, बस Reflection.Emit का उपयोग कर बनाने के लिए एक नई विधानसभा अधिक कुशल और बहुत आसान है के बारे में परवाह नहीं करते हैं।

+0

यह समाधान सीधे प्रश्न का उत्तर देता है। धन्यवाद। –

1

आप सिस्टम का उपयोग भी कर सकते हैं। रिफ्लेक्शन। नेमस्पेस दर्ज करें और एक गतिशील, इन-मेमोरी असेंबली बनाएं।

वैकल्पिक & संकलन कोड उत्पन्न करने के लिए कोडडॉम का उपयोग करना वैकल्पिक है, फिर इसमें कॉल करें।

XMLSerialization() बाद वाला करता है।

1

आप आईएल में हेरफेर करने के लिए Mono.Cecil का उपयोग कर सकते हैं। यह एक शक्तिशाली उपकरण है, हालांकि किसी भी तरह से दस्तावेज की कमी है।