3
  1. ねえ、私の質問は単純ですが、これを行う方法を見つけることができません。

私がやろうとしていることは、すべてのDLLインポートとEXEまたはDLLから使用される関数を取得しようとすることです。

したがって、次のコマンドを使用してプログラムを作成するとします。SendMessage(DLL Import)すると、コードはそれを読み取ることができます。

そして次のように戻ります:

DLL: user32.dll

関数: SendMessage

アセンブリを使用してみました。しかし、そこから正しいデータを取得することはできません。

(私は見ました:C#でネイティブDLLインポートをプログラムで読み取る方法? しかし、そこでも機能しませんでした、私は1つのインポートを取得しましたが、それ以上はありません)

4

2 に答える 2

3

DUMPBINプログラムは、DLL PEヘッダーを調べて、この情報を判別できるようにします

C#ラッパーについては知りませんが、これらの記事では、ヘッダーを調べてエクスポートを自分でダンプする方法を説明する必要があります

水平思考としてdumpbin.exe /exports-.netSystem.Process呼び出しでラップして、結果を解析してみませんか?

于 2012-10-22T00:40:04.207 に答える
2

純粋な反射アプローチ

    static void Main(string[] args)
    {
        DumpExports(typeof (string).Assembly);
    }

    public static void DumpExports( Assembly assembly)
    {

        Dictionary<Type, List<MethodInfo>> exports = assembly.GetTypes()
            .SelectMany(type => type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
                                    .Where(method => method.GetCustomAttributes(typeof (DllImportAttribute), false).Length > 0))
            .GroupBy(method => method.DeclaringType)
            .ToDictionary( item => item.Key, item => item.ToList())
            ;

        foreach( var item in exports )
        {
            Console.WriteLine(item.Key.FullName);

            foreach( var method in  item.Value )
            {
                DllImportAttribute attr = method.GetCustomAttributes(typeof (DllImportAttribute), false)[0] as DllImportAttribute;
                Console.WriteLine("\tDLL: {0}, Function: {1}", attr.Value, method.Name);
            }
        }
    }
于 2012-10-22T00:58:20.893 に答える