2012-02-22 8 views
5

से कोड पुनर्प्राप्त करें I ILGenerator का उपयोग कर exe फ़ाइल बनाने के लिए कुछ फ़ंक्शन लिख चुके हैं। मैं जो चाहता हूं वह आईएल भाषा को ILDasm या परावर्तक जैसे बाहरी उपकरणों का उपयोग करके जेनरेट किया गया है।ILGenerator

मेरे कार्यक्रम के निष्पादन के दौरान मैंने प्रत्येक ओपकोड को आईएलजीनरेटर में जोड़ा है, इसलिए मैं ओपकोड प्रतिनिधित्व के साथ एक स्ट्रिंग का उपयोग करके इस ओपोड को प्रत्येक सूची में सहेज सकता हूं लेकिन मैं सीधे आईएल कोड प्राप्त करना चाहता हूं। क्या यह किया जा सकता है?

महत्वपूर्ण: मैं मोनो 2.6 का उपयोग कर रहा हूं।

+3

मोनो। सेसिल इस तरह के प्रश्नों के लिए मानक उत्तर है। –

उत्तर

3

रूप हंस Passant और svick ने कहा था, इस सवाल का जवाब Mono.Cecil है। चलो देखते हैं:

using Mono.Cecil; 
using Mono.Cecil.Cil; 

[...] 


public void Print() { 
    AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(this.module_name); 

    int i = 0, j = 0; 
    foreach (TypeDefinition t in assembly.MainModule.Types) { 
     if (t.Name == "FooClass") { 
      j = i; 
     } 
     i++; 
    } 

    TypeDefinition type = assembly.MainModule.Types[ j ]; 

    i = j = 0; 
    foreach (MethodDefinition md in type.Methods) { 
     if (md.Name == "BarMethod") { 
      j = i; 
     } 
     i++; 
    } 

    MethodDefinition foundMethod = type.Methods[ j ]; 

    foreach(Instruction instr in foundMethod.Body.Instructions) { 
     System.Console.WriteLine("{0} {1} {2}", instr.Offset, instr.OpCode, instr.Operand); 
    } 
} 

निश्चित रूप से इसे और अधिक कुशल किया जा सकता है लेकिन यह मेरी समस्या हल करता है।

+0

मुझे लगता है कि LINQ और 'सिंगल()' का उपयोग करके आपका कोड आसानी से फिर से लिखा जा सकता है। – svick

5

यदि आपके पास MethodBuilder है, तो आपको के रूप में आईएल प्राप्त करने के लिए builder.GetMethodBody().GetILAsByteArray() का उपयोग करने में सक्षम होना चाहिए। लेकिन इससे कोई समझने के लिए, आपको इसे किसी भी तरह से पार्स करने की आवश्यकता होगी।

तो, बेहतर विकल्प शायद Mono Cecil का उपयोग कर रहा है, जो आपको एक पठनीय प्रारूप में एक असेंबली का आईएल कोड दे सकता है।

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