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