从ILGenerator中检索代码

时间:2012-02-22 11:18:29

标签: c# .net mono command-line-interface ilgenerator

我已经编写了一些函数来使用ILGenerator创建一个exe文件。我想要的是向用户展示使用ILDasm或Reflector等外部工具生成的IL语言。

在我的程序执行期间,我已将每个OpCode添加到ILGenerator,因此我可以使用带有OpCode表示的字符串将每个OpCode保存在列表中,但我希望直接获取IL代码。可以吗?

重要:我使用的是Mono 2.6。

2 个答案:

答案 0 :(得分:5)

如果您有MethodBuilder,则应该可以使用builder.GetMethodBody().GetILAsByteArray()将IL作为byte[]。但要明白这一点,你需要以某种方式解析它。

因此,更好的选择可能是使用Mono Cecil,它可以以可读格式为您提供程序集的IL代码。

答案 1 :(得分:3)

正如 Hans Passant 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 );
    }
}

当然可以提高效率,但它解决了我的问题。