2012-02-22 10 views
5

Tengo que escribir alguna función para crear un archivo exe usando ILGenerator. Lo que quiero es mostrar al usuario el lenguaje IL generado sin usar herramientas externas como ILDasm o Reflector.Recupere el código de ILGenerator

durante la ejecución de mi programa He agregado cada OpCode a ILGenerator, así que puedo guardar cada uno de estos OpCode en una lista usando una cadena con la representación OpCode pero deseo obtener el código IL directamente. Se puede hacer?

Importante: Estoy usando Mono 2.6.

+3

Mono.Cecil es la respuesta estándar para este tipo de preguntas. –

Respuesta

3

Como Hans Passant había dicho y svick, la respuesta es Mono.Cecil. Veamos:

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

Seguro que se puede hacer más eficiente pero resuelve mi problema.

+0

Creo que su código podría reescribirse fácilmente para ser mucho más legible utilizando LINQ y 'Single()'. – svick

5

Si tiene un MethodBuilder, debe poder usar builder.GetMethodBody().GetILAsByteArray() para obtener el IL como byte[]. Pero para sacarle algún sentido a eso, necesitarías analizarlo de alguna manera.

Por lo tanto, una mejor opción es probablemente el uso de Mono Cecil, que le puede dar el código IL de un conjunto en un formato legible.

Cuestiones relacionadas