Pregunta

He escrito alguna función para crear un archivo exe usando ILGenerator. Lo que quiero es mostrar al usuario que el lenguaje IL generó sin usar herramientas externas como ILDASM o reflector.

Durante la ejecución de mi programa, he agregado cada código de operación a ILGenerator, por lo que puedo guardar cada uno de este código de operación en una lista usando una cadena con la representación de código de operación, pero desearía preferir obtener el código IL directamente. Se puede hacer?

Importante: Estoy usando mono 2.6.

¿Fue útil?

Solución 2

Como Hans Passant y svick Había dicho, la respuesta es mono.cecil. Vamos a ver:

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

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

Otros consejos

Si tienes un MethodBuilder, deberías poder usar builder.GetMethodBody().GetILAsByteArray() para obtener la IL como un byte[]. Pero para darle sentido a eso, necesitaría analizarlo de alguna manera.

Entonces, una mejor opción probablemente esté usando Mono cecil, que puede darle el código IL de un ensamblaje en un formato legible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top