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 IL をTextBox

どうすればそのようなことを達成できますか?

4

1 に答える 1

0

「ふぅ!」ついに解決!

これは、将来同じことをしようとする人のための解決策です。

「リスト」のインスタンスを作成し、メソッドを反復処理してそのようなリストに名前を割り当てます。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 フォームは、2 つの小さな便利なプロパティを持っていTagますContent

Tagandプロパティを使用すると、このタスク専用のメソッド名に依存することなくContent、後で取得できる任意の値を割り当てることができます。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 に答える