2012-03-10 14 views
5

.NET फ्रेमवर्क, संस्करण 4.5 के नवीनतम संस्करण में, MethodBuilder वर्ग एक विधि SetMethodBody मुझे विश्वास है कि वास्तव में क्या मैं (ILGenerator उपयोग करने के लिए एक विकल्प के रूप में देख रहा हूँ है जो कहा जाता है परेशान और विषम तरीकों से सीमित)। प्रलेखन here पाया जा सकता है, हालांकि बाद से .NET 4.5 अभी तक बाहर नहीं है, यह पूरी तरह से प्रलेखित नहीं है। मैं दो तर्कों के अलावा सभी की आपूर्ति कर सकता हूं, लेकिन शेष मुझे मदद की ज़रूरत होगी।.NET 4.5 MethodBuilder.SetMethodBody

पहला यह है कि मुझे समझ नहीं आता byte[] localSignature, तीसरा तर्क है। MSDN कहा गया है कि यह "बाइट्स कि धारावाहिक स्थानीय चर संरचना शामिल की एक सरणी। अशक्त निर्दिष्ट करें यदि विधि कोई स्थानीय चर है।" मुसीबत यह है कि, यह सब कुछ कहता है, और मुझे "धारावाहिक स्थानीय परिवर्तनीय हस्ताक्षर" के प्रारूप का पता नहीं लगाया जा सकता है। मैंने ईसीएमए -335 स्पेक में देखने की कोशिश की है, लेकिन मुझे पता चला है कि असीमित सीआईएल में स्थानीय चर निर्दिष्ट करने के लिए। अगर कोई इसे समझने में मेरी मदद कर सकता है, तो इसकी सराहना की जाएगी।

इसके अलावा, अंतिम तर्क IEnumerable<int> tokenFixups, जो है "मूल्यों है कि इल में ऑफसेट प्रतिनिधित्व करते हैं, एक टोकन है कि संशोधित किया जा सकता की शुरुआत निर्दिष्ट करता है, जिनमें से प्रत्येक का एक संग्रह है। अशक्त निर्दिष्ट करें यदि विधि कोई टोकन है कि है संशोधित किया जा सकता है। " मुझे संदेह है कि मुझे इनका उपयोग करने की आवश्यकता नहीं होगी, लेकिन मैं जानना चाहता हूं कि वे वैसे भी क्या हैं।

धन्यवाद, ब्रैंडन

+5

आप SignatureHelper वर्ग की आवश्यकता होगी। फिक्सअप केवल उन कंपाइलरों के लिए हैं जो मूल कोड को आईएल में अनुवाद करते हैं, जैसे सी ++/सीएलआई। –

+0

@ हंस पासेंट: उत्तर के लिए धन्यवाद! :) – aboveyou00

उत्तर

4

मेरे सवाल का असली जवाब एक जवाब के बजाय, एक टिप्पणी के रूप में तैनात किया गया था, ताकि कोई और मामला किसी में कभी यह सवाल है ... यहां पोस्ट जवाब है:

आप SignatureHelper वर्ग की आवश्यकता होगी। फिक्सअप केवल उन कंपाइलरों के लिए हैं जो मूल कोड को आईएल में अनुवाद करते हैं, जैसे सी ++/सीएलआई। - Hans Passant ताकि स्थानीय हस्ताक्षर के लिए बाइट सरणी प्राप्त करने के लिए 13:02

पर मार्च 10 इसलिए ... आप इस कोड को निष्पादित कर सकते हैं:

var sig = SignatureHelper.GetLocalVarSigHelper(this.module); 
sig.AddArgument(typeof(int)); //Local #0 is of type int 
... 
sig.AddArgument(typeof(string)); //Local #n is of type string 
var sigArray = sig.GetSignature(); 

और विधि सेट करने के लिए MethodBuilder पर शरीर, आप

MethodBuilder.SetMethodBody(il, maxStack, sigArray, handlers, fixups); 

... जहां इल वैध आईएल निर्देश (this page देखें) के साथ एक byte[] है कहते हैं, maxStack धब्बे की संख्या के साथ एक पूर्णांक स्टैक पर आरक्षण है विधि के लिए, संचालकों एक System.Reflection.Emit.ExceptionHandler[] है, और fixups एक int[] सरणी कि अनदेखा किया जा सकता है (एक अपवाद के साथ, नीचे देखें।)

एक बात है कि मैं हंस Passant की टिप्पणी में से असहमत है कि fixups compilers के लिए न केवल कर रहे हैं जो आईएल में मूल कोड का अनुवाद करता है। मुझे पता चला जब इस पर काम कर कि यदि आप एक MethodBuilder विधि के लिए एक कॉल का उत्सर्जन करने की कोशिश, यह गलत अनुदेश उत्सर्जन करता है। .NET परावर्तक में आईएलजीनरेटर को देखते हुए, मुझे पता चला कि जब भी वे एक विधि कॉल उत्सर्जित करते हैं तो वे एक फिक्सअप उत्सर्जित करते हैं। प्रत्येक विधि कॉल के लिए एक फिक्सअप जोड़ना वास्तव में इस समस्या को ठीक करता है। ऐसे कई स्थान हो सकते हैं जहां आपको सही तरीके से काम करने के लिए एक फिक्सअप उत्सर्जित करने की आवश्यकता हो, लेकिन मैंने इसमें बहुत कुछ नहीं देखा है।

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