0

我有一个带有 a和 a的 WPFMainWindow表单,如下所示:ListBoxTextBox

图 A. 带有示例文本的 WPF 主窗口。 图 A. 带有示例文本的 WPF 主窗口。

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

图 B. 显示填充了方法名称的 ListBox 图 B. 显示填充了方法名称的 ListBox

现在的技巧部分,我想从我选择的任何方法ListBox中显示其各自的 MethodBody ILTextBox

我怎样才能做到这一点?

4

1 回答 1

0

“呸!” 终于解决了!

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

创建一个'List'的实例,然后遍历方法并将名称分配给这样的列表,然后每当你的SelectedItem 索引值发生变化时,我可以简单地调用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 "";
    }

这个想法是'GetMethodBodyByName'将接收方法名称作为参数,然后它将遍历方法并查看方法是否与给定名称匹配,然后如果找到,该函数将简单地遍历该方法并输出方法的主体.

这是我的ListBox_SelectedItemChanged活动的样子:

private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        textBox.Text = "";
        textBox.Text = GetMethodBodyByName(method[listBox.SelectedIndex].Name);
    }

这就是所有人!

注意:使用这种方法时要小心,就好像在请求名称时,不同的方法可以具有相同的名称。但这是另一天的蛋糕,我现在完成了!保重再见!


为终极解决方案而努力!

WPF MainWindow 窗体本身带有两个有用的小属性,它们是:TagContent,其想法如下:

使用TagandContent属性,我们可以为它分配任何值,以便以后可以检索它,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);

然后在您的SelectedItemIndex-Value-Changed Event 上放置:

            MSILTextBox.Clear();
            // Retrieve them given the selected index...
            // ... the returned value will be the Tag content of the ...
            // ... previously saved item.
            string getTag= ((ListBoxItem)listBox.SelectedItem).Tag.ToString();
            MSILTextBox.Text = getTag;
于 2016-08-30T00:39:34.500 回答