Получить код от ILGenerator - PullRequest
       58

Получить код от ILGenerator

5 голосов
/ 22 февраля 2012

Я написал некоторую функцию для создания exe-файла с использованием ILGenerator.Я хочу показать пользователю язык IL, созданный без использования внешних инструментов, таких как ILDasm или Reflector.

во время выполнения моей программы я добавил каждый OpCode в ILGenerator, чтобы я мог сохранить каждый этот OpCode в списке, используя строку с представлением OpCode, но я бы предпочел получить код IL напрямую.Можно ли это сделать?

Важно : Я использую Mono 2.6.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Если у вас есть MethodBuilder, вы можете использовать builder.GetMethodBody().GetILAsByteArray(), чтобы получить IL как byte[]. Но чтобы разобраться в этом, нужно как-то разобрать.

Таким образом, лучшим выбором, вероятно, является использование Mono Cecil , которое может дать вам код IL сборки в удобочитаемом формате.

3 голосов
/ 23 февраля 2012

Как сказал Ганс Пассант и svick , ответ - Mono.Cecil. Посмотрим:

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

Конечно, это можно сделать более эффективно, но это решает мою проблему.

...