我有一个WPF MainWindow
表单,其中ListBox
和TextBox
如下所示:
现在,Load Assembly...
OnClick 按钮事件允许我选择.NET程序集并使用DnLib
然后,如果我想显示方法体,我会这样做:
Assembly asm = Assembly.LoadFile(filename);
foreach (Module mod in asm.GetModules())
{
foreach (Type types in mod.GetTypes())
{
foreach (MethodInfo mdInfo in types.GetMethods())
{
listBox.Items.Add(mdInfo.Name);
}
}
}
这会将每个找到的方法名称添加到左侧的ListBox
,结果如下:
现在是技巧部分,我希望我从ListBox
中选择哪种方法在TextBox
上显示其各自的MethodBody IL
我怎样才能实现这样的目标?
答案 0 :(得分:0)
创建一个'List'实例,然后遍历这些方法并将名称分配给这样的列表,然后每当
SelectedItem
index 值发生变化时,我只需调用{{1然后我肯定可以解决这个问题
以下是如何实现函数GetMethodBodyByName
:
GetMethodBodyByName
这个想法是'GetMethodBodyByName'将接收方法名称作为参数,然后它将遍历方法并查看方法是否与给定名称匹配,然后如果找到,该函数将只是简单地遍历该方法并输出方法的主体。
以下是public string GetMethodBodyByName(string methodName)
{
ModuleDefMD md = ModuleDefMD.Load(filename);
foreach (TypeDef type in md.Types)
{
foreach (MethodDef method in type.Methods)
{
for (int i = 0; i < type.Methods.Count; i++)
{
if (method.HasBody)
{
if (method.Name == methodName)
{
var instr = method.Body.Instructions;
return String.Join("\r\n", instr);
}
}
}
}
}
return "";
}
事件的显示方式:
ListBox_SelectedItemChanged
注意:执行此方法时要小心,就像请求名称时一样,不同的方法可以具有相同的名称。但这是另一天的蛋糕,我现在已经完成了!小心再见!
WPF MainWindow表单带有两个有用的小属性,它们是:private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
textBox.Text = "";
textBox.Text = GetMethodBodyByName(method[listBox.SelectedIndex].Name);
}
和Tag
,其思路如下:
使用
Content
和Tag
属性,我们可以为其分配任何值,以后可以检索Content
,而不必依赖于专门用于此任务的方法名称。
所以你不是分别循环每个方法并得到它的名字,你可以像我一样做:
遍历Method,并将其主体分配给
On-The-Fly
属性,将其名称分配给Tag
属性,因为最后一个属性是处理实际Content
属性的属性,所以无视你将来对该方法所做的任何事情,即使它与另一个方法的名称相同,无论如何都会有效。
我们如何实施?
简单地:
Title
然后在您的<...>
// Inside Method Body iteration routine...
<...>
var instr = mdInfo.Body.Instructions;
// Allocate in a new `ListBoxItem` each method and add it to the current listbox with their
// ... respective Tag and Content information... // Many Thanks Kao :D
newItem = new ListBoxItem();
newItem.Content = mdInfo.Name;
newItem.Tag = string.Join("\r\n", instr);
method.Add(mdInfo);
listBox.Items.Add(newItem);
索引值更改事件中输入:
SelectedItem