Question

J'ai écrit de la fonction pour créer un fichier EXE à l'aide d'ilGenerator. Ce que je veux, c'est montrer à l'utilisateur du langage IL généré avec l'utilisation d'outils externes comme l'ildasme ou le réflecteur.

Lors de l'exécution de mon programme, j'ai ajouté chaque opcode à ilGenerator, afin que je puisse enregistrer chacun de cet opcode dans une liste à l'aide d'une chaîne avec la représentation OPCode, mais je souhaite préférer obtenir le code IL directement. Peut-il être fait?

Important: J'utilise Mono 2.6.

Était-ce utile?

La solution 2

Comme Hans passant et svick avait dit, la réponse est mono.cecil. Voyons voir:

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

Bien sûr, cela peut être fait plus efficace, mais cela résout mon problème.

Autres conseils

Si tu as un MethodBuilder, vous devriez pouvoir utiliser builder.GetMethodBody().GetILAsByteArray() Pour obtenir l'IL comme un byte[]. Mais pour en avoir un sens, vous devrez l'analyser d'une manière ou d'une autre.

Donc, un meilleur choix est probablement d'utiliser Mono cecil, qui peut vous donner le code IL d'un assemblée dans un format lisible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top