从 ILGenerator 检索代码

发布于 2025-01-08 03:55:14 字数 243 浏览 0 评论 0原文

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

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

重要:我使用的是 Mono 2.6。

I have write some function to create an exe file using ILGenerator. What I want is to show to user the IL language generated whithout using external tools like ILDasm or Reflector.

during the execution of my program I have added each OpCode to ILGenerator, so I can save each of this OpCode in a list using a string with the OpCode representation but I wish prefer to get the IL code directly. Can it be done?

Important: I'm using Mono 2.6.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

汐鸠 2025-01-15 03:55:14

如果您有 MethodBuilder,则应该能够使用 builder.GetMethodBody().GetILAsByteArray() 获取 byte[] 形式的 IL >。但要理解这一点,您需要以某种方式解析它。

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

If you have a MethodBuilder, you should be able to use builder.GetMethodBody().GetILAsByteArray() to get the IL as a byte[]. But to make any sense out of that, you would need to parse it somehow.

So, a better choice is probably using Mono Cecil, which can give you the IL code of an assembly in a readable format.

∞觅青森が 2025-01-15 03:55:14

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

当然可以更有效地完成,但它解决了我的问题。

As Hans Passant and svick had said, the answer is Mono.Cecil. Let's see:

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

Sure it can be done more efficient but it solves my problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文