5

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

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

重要提示:我使用的是 Mono 2.6。

4

2 回答 2

5

如果你有一个MethodBuilder,你应该可以用builder.GetMethodBody().GetILAsByteArray()得到的 IL 作为一个byte[]. 但是要弄清楚这一点,您需要以某种方式对其进行解析。

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

于 2012-02-22T13:12:56.513 回答
3

正如Hans Passantsvick所说,答案是 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 );
    }
}

当然它可以做得更有效,但它解决了我的问题。

于 2012-02-23T09:12:04.550 回答