3
  1. 嘿,我的问题很简单,但我找不到办法做到这一点。

我尝试做的是:我尝试从 EXE 或 DLL 获取所有 DLL 导入和使用的函数。

因此,假设我使用以下内容制作了一个程序: SendMessage (DLL Import) 然后代码将设法读取它。

并返回:

DLL: user32.dll

功能:发送消息

我尝试过使用:Assembly。但是没有运气从中获得正确的数据。

(我确实看过:如何在 C# 中以编程方式读取本机 DLL 导入? 但也没有让它在那里工作,我得到了 1 个导入,但仅此而已)

4

2 回答 2

3

DUMPBIN程序检查 DLL PE 标头并让您确定此信息。

我不知道任何 C# 包装器,但这些文章应该向您展示如何检查标头并自己转储导出

作为一个横向的想法 - 为什么不dumpbin.exe /exports使用 .net System.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 回答