एक नवीनता के रूप में, मैं यह देखने की कोशिश कर रहा हूं कि वीएस कंपाइलर द्वारा उत्पन्न रनटाइम दिखने वाले कोड पर जेनरेट किए गए हल्के वजन कोड से आईएल कितना अलग है, जैसा कि मैंने देखा है कि वीएस कोड एक अलग प्रदर्शन प्रोफ़ाइल के साथ चलाने के लिए जाता है चीजें जैसे चीजें।मैं एक डायनामिक मोड से आईएल बाइटियर कैसे प्राप्त करूं?
तो मैं निम्नलिखित कोड ::
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
दुर्भाग्य से, यह एक अपवाद फेंकता के रूप में GetMethodBody जाहिरा तौर पर अभिव्यक्ति के पेड़ से उत्पन्न कोड पर एक अवैध संचालन है लिखा था। मैं लाइब्रेरी तरीके से कैसे कर सकता हूं (यानी बाहरी उपकरण के साथ नहीं जब तक टूल में एपीआई न हो) हल्के कोडजन का उपयोग करके कोड द्वारा उत्पन्न कोड को देखें?
संपादित करें: त्रुटि 5 पर संकलित होती है, compiled.Method.GetMethodBody() अपवाद फेंकता है।
संपादित 2: क्या कोई जानता है कि विधि में घोषित स्थानीय चर कैसे पुनर्प्राप्त करें? या GetVariables के लिए कोई रास्ता नहीं है?
कौन सी लाइन अपवाद फेंक रही है? क्या आप पहले ऐरे को टिप्पणी कर सकते हैं। प्रत्येक के लिए और देखें कि क्या यह काम करता है?मुझे संदेह है कि GetMethodBody() को पहला कॉल बस विफल रहा है क्योंकि उस अभिव्यक्ति को आईएल में संकलित नहीं किया गया है। मुझे कोई कारण नहीं दिख रहा कि दूसरी कॉल क्यों विफल होनी चाहिए। – cdhowie
दिलचस्प सवाल। मुझे GetMethodBody कॉल पर एक अवैधऑपरेशन अपवाद ("ऑब्जेक्ट की वर्तमान स्थिति के कारण वैध नहीं है") मिल रहा है। मुझे यकीन नहीं है कि कैसे कैश किए गए एनामीट डिलीगेट बनाम अभिव्यक्ति के रूप में जीवन शुरू करना आपके व्यवहार को एक Func के रूप में प्रभावित करेगा। मैं इसे काम करने के लिए जा रहा हूँ। – Sorax
चयनित उत्तर को स्विच किया जाना चाहिए क्योंकि इसमें सभी मामलों को शामिल नहीं किया गया है और यह अनावश्यक रूप से जटिल है। कृपया [यह उत्तर] देखें (http://stackoverflow.com/a/35711507/521757)। – jnm2