2013-02-16 48 views
5

मैं .NET के बस-इन-टाइम कंपाइलर द्वारा उत्पन्न x86 असेंबली देखना चाहता हूं। मुझे पता है कि how to do this for "normal" code, समय से पहले संकलित है, लेकिन यह नहीं पता कि रनटाइम पर गतिशील रूप से उत्पन्न कोड के लिए इसे कैसे करना है (जो मैं अभिव्यक्ति पेड़ों के साथ कर रहा हूं)।अभिव्यक्ति वृक्ष संकलित करके बनाए गए प्रतिनिधि के डिस्सेप्लर को मैं कैसे देखूं?

मुझे भी सच में यकीन नहीं है कि क्या प्रयास करना है। उदाहरण के लिए, एक पते पर अभिव्यक्ति वृक्ष बिंदु संकलित करके बनाया गया प्रतिनिधि, लेकिन मुझे नहीं पता कि उस पते पर क्या है यह देखने के लिए क्या उपयोग करना है।

उत्तर

2

मैं लेपी के मूल सुझाव का उपयोग करके समाप्त हुआ, बाहरी अभिव्यक्ति को अभिव्यक्ति को आउटपुट कर रहा था। फिर, मैंने विधि निकालने के लिए परावर्तक का उपयोग किया और इसे अपने कोड में पेस्ट किया। तब मैंने चिपकाया विधि चलाया, और जांच की कि क्या लगाया गया था। यह 100% सटीक नहीं हो सकता है, लेकिन यह कम से कम एक संकेत देता है।

यहाँ विधि बाहर लिखने के लिए कुछ कोड (जिसके परिणामस्वरूप विधानसभा निष्पादन उसी निर्देशिका में समाप्त होता है) है:

/// <summary> 
/// Writes an assembly, containing the given method, to the working directory. 
/// The assembly, type, and method are named based on the given hash name. 
/// </summary> 
public static void WriteMethodToAssembly<T>(Expression<T> method, string hashName) { 
    var assemblyName = new AssemblyName(hashName); 
    var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
    var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll"); 
    var typeBuilder = moduleBuilder.DefineType(hashName, TypeAttributes.Public); 
    var methodBuilder = typeBuilder.DefineMethod("Run" + hashName, MethodAttributes.Public | MethodAttributes.Static); 
    method.CompileToMethod(methodBuilder); 

    typeBuilder.CreateType(); 
    assemblyBuilder.Save(hashName + ".dll"); 
} 

एक बार जब आप विधानसभा है, तो आप एक उपकरण के परावर्तक की तरह विधि को निकालने के लिए उपयोग कर सकते हैं ।

+0

साझा करने के लिए धन्यवाद :) – leppie

2

LambdaExpression.CompileToMethod(MethodBuilder) का उपयोग करें।

फिर आप असेंबलीबिल्डर को उस फ़ाइल में सहेज सकते हैं जिसे आप अपने पसंदीदा, नेट डिस्सेबलर में देख सकते हैं।

+0

क्या जिटर सीआईएल को असेंबली से लोड होने के समान ही रनटाइम पर उत्पन्न होता है? क्या होगा यदि उदाहरण के लिए, हेरिस्टिक्स जो किसी एक मामले में अधिक अनुकूलन करता है? –

+0

क्या आप जेआईटी असेंबली या आईएल देखना चाहते हैं? मेरा जवाब पूर्व पर लागू नहीं है। आईएल से कहीं भी लोड किया जाना चाहिए। – leppie

+0

मैं x86 असेंबली कोड देखना चाहता हूं। –