读取程序集MethodBody,在ListBox中解析其名称,在TextBox中解析它的IL?

时间:2016-08-29 20:57:27

标签: c# dnlib

我有一个WPF MainWindow表单,其中ListBoxTextBox如下所示:

  

Figure A. WPF MainWindow with Sample Text.   图A.带样本文本的WPF MainWindow。

现在,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,结果如下:

  

Figure B. Showing the ListBox Filled with Methods Names   图B.显示填充方法名称的ListBox

现在是技巧部分,我希望我从ListBox中选择哪种方法在TextBox上显示其各自的MethodBody IL

我怎样才能实现这样的目标?

1 个答案:

答案 0 :(得分:0)

«P !!»终于解决了!

对于将来尝试做同样事情的人来说,这是解决方案。

  

创建一个'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,其思路如下:

  

使用ContentTag属性,我们可以为其分配任何值,以后可以检索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