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

标签 c# reflection system.reflection mono.cecil

我一直在寻找一个新手问题,但找不到一个简单的例子。 谁能给我一个简单的例子,说明如何将 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");
        }
    }
}

最佳答案

从阅读您的程序集开始:

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

关于c# - Mono.Cecil - 如何获取方法体的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923757/

相关文章:

c# - 使用 Lambda 或 LINQ 将一个类实例转换或映射到另一个实例的列表?

c# - 如何使用xmlreader读取这个xml

c# - LINQ where 子句中的三元运算符

c# - 为什么我们不能在 Entity Framework 查询中使用数组?

c# - 如何使属性真正只读?

c# - 从 FieldInfo 获取容器类实例

java注释-运行时自动使用

c# - 从字符串变量中的名称创建类的对象实例

C# 反射 : Type cast method return value in specific type of object list

c# - 获取类型的成员描述