2012-02-22 11 views
5

ILGenerator kullanarak bir exe dosyası oluşturmak için bazı işlevler yazarım. İstediğim, ILDasm veya Reflector gibi harici araçları kullanmadan üretilen IL dilini kullanıcıya göstermek.ILGenerator'dan kodu al

Programımın yürütülmesi sırasında her bir OpCode'u ILGenerator'a ekledim, bu yüzden bu OpCode'u OpCode gösterimi ile bir dize kullanarak bir listeye kaydedebilirim ancak IL kodunu doğrudan almayı tercih ediyorum. Bu yapılabilir mi?

Önemli: Mono 2.6 kullanıyorum.

+3

Mono.Cecil bu tür sorular için standart cevaptır. –

cevap

3

, cevap Mono.Cecil olduğunu. Bakalım:

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); 
    } 
} 

daha verimli yapılabilir ama benim sorunu çözer Tabi.

+0

LINQ ve 'Single()' kullanarak kodunuzun daha kolay okunabilmesi için kolayca yeniden yazılabileceğini düşünüyorum. – svick

5

MethodBuilder'unuz varsa, IL byte[] olarak almak için builder.GetMethodBody().GetILAsByteArray() kullanabilmeniz gerekir. Fakat bundan bir anlam çıkarmak için, bir şekilde onu ayrıştırmanız gerekecek.

Bu nedenle, daha iyi bir seçim, okunabilir bir biçimde bir derlemenin IL kodunu verebileceğiniz Mono Cecil kullanıyordur. ve svick demişti Hans Passant olarak