Mono.Cecil - 如何获取方法体的简单示例

时间:2018-04-19 14:35:47

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

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

#output:
ng_if attr = !People.disableActions
href_link attr = https://...

1 个答案:

答案 0 :(得分: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.Select(m => new {t, m}))
  .Where(x => x.m.HasBody);

如果您已经知道类型和方法名称,则可以修改查询

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 ""