【问题标题】:Mono.Cecil - simple example how to get method bodyMono.Cecil - 如何获取方法体的简单示例
【发布时间】:2018-09-30 02:46:09
【问题描述】:

我一直在寻找一个新手问题,但找不到一个简单的例子。 谁能给我一个简单的例子,如何让 MethodBody 成为最可用的字符串结果?喜欢:

using Mono.Cecil;
using Mono.Cecil.Cil;

namespace my
{
    public class Main
    {
        public Main()
        {
             // phseudo code, but doesnt work
            Console.Write(    getMethod("HelloWorld").GetMethodBody().ToString()   );
        }

        public void HelloWorld(){
             MessageBox.Show("Hiiiiiiiiii");
        }
    }
}

【问题讨论】:

  • 您需要或期望什么样的字符串结果?十六进制的IL字节码?人类可读的 IL 指令? ...?
  • @thehennyy 我想要人类可读的。我知道它不会是 100% 完美的,但尽可能做到最大。
  • ildasm 是一个选项吗?否则,您应该找到一些如何使用 mono.cecil 获取方法主体的代码。从那里你可以遍历Instruction-objects,我认为他们支持ToString()
  • @thehennyy 伙计,这就是我要问的。我找不到,这就是我在这里问的原因 - 我不是 C# 专业人士。

标签: c# reflection system.reflection mono.cecil


【解决方案1】:

从阅读你的程序集开始:

var path = "... path to your assembly ...";
var assembly = AssemblyDefinition.ReadAssembly(path);

如果你想打开正在运行的进程,你可以使用System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName作为path

现在获取您想要检查的所有类型和方法

var toInspect = assembly.MainModule
  .GetTypes()
  .SelectMany(t => t.Methods
      .Where(m => m.HasBody)
      .Select(m => new {t, m}))
  

如果您已经知道类型和方法名称,您可以像这样修改您的查询:

toInspect = toInspect.Where(x => x.t.Name.EndsWith("Main") && x.m.Name == "HelloWorld");

之后,只需遍历该集合:

foreach (var method in toInspect)
{
    Console.WriteLine($"\tType = {method.t.Name}\n\t\tMethod = {method.m.Name}");
    foreach (var instruction in method.m.Body.Instructions)
        Console.WriteLine($"{instruction.OpCode} \"{instruction.Operand}\"");
}

输出将是

Type = Main
  Method = HelloWorld

ldstr "Hiiiiiiiiii"
call "System.Windows.Forms.DialogResult System.Windows.Forms.MessageBox::Show(System.String)"
pop ""
ret ""

【讨论】:

  • Aleks,非常感谢您的出色回答,我已按时投票并标记它。但是,我的问题是,当你定义 toInspect 对象时,你能给我一个不使用 linq 的版本吗(所以,没有“selectMany & where”命令)?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多