簡體   English   中英

Mono.Cecil - 如何獲取方法體的簡單示例

[英]Mono.Cecil - simple example how to get method body

我一直在尋找一個新手問題,但找不到一個簡單的例子。 誰能給我一個簡單的例子,如何將 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 ""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM