Domanda

Devo scrivere una funzione per creare un file exe utilizzando ILGenerator.Quello che voglio è quello di mostrare all'utente il linguaggio generato senza utilizzo di strumenti esterni come ILDasm o di un Riflettore.

durante l'esecuzione del mio programma ho aggiunto ogni OpCode per ILGenerator, così posso salvare ogni OpCode in un elenco utilizzando una stringa con il codice Operativo della rappresentazione, ma vorrei preferiscono avere il codice direttamente.Può essere fatto?

Importante:Sto usando Mono 2.6.

È stato utile?

Soluzione 2

Come Hans Passant e Svick aveva detto, la risposta è mono.cecil. Vediamo:

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

Certo può essere fatto più efficiente ma risolve il mio problema.

Altri suggerimenti

Se si dispone di un MethodBuilder, si dovrebbe essere in grado di utilizzare builder.GetMethodBody().GetILAsByteArray() per ottenere il come byte[].Ma il senso di che, è necessario analizzare in qualche modo.

Così, la scelta migliore è probabilmente utilizzando Mono Cecil, che può dare il codice di un assieme in un formato leggibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top