- 嘿,我的问题很简单,但我找不到办法做到这一点。
我尝试做的是:我尝试从 EXE 或 DLL 获取所有 DLL 导入和使用的函数。
因此,假设我使用以下内容制作了一个程序: SendMessage (DLL Import) 然后代码将设法读取它。
并返回:
DLL: user32.dll
功能:发送消息
我尝试过使用:Assembly。但是没有运气从中获得正确的数据。
(我确实看过:如何在 C# 中以编程方式读取本机 DLL 导入? 但也没有让它在那里工作,我得到了 1 个导入,但仅此而已)
我尝试做的是:我尝试从 EXE 或 DLL 获取所有 DLL 导入和使用的函数。
因此,假设我使用以下内容制作了一个程序: SendMessage (DLL Import) 然后代码将设法读取它。
并返回:
DLL: user32.dll
功能:发送消息
我尝试过使用:Assembly。但是没有运气从中获得正确的数据。
(我确实看过:如何在 C# 中以编程方式读取本机 DLL 导入? 但也没有让它在那里工作,我得到了 1 个导入,但仅此而已)
DUMPBIN程序检查 DLL PE 标头并让您确定此信息。
我不知道任何 C# 包装器,但这些文章应该向您展示如何检查标头并自己转储导出
作为一个横向的想法 - 为什么不dumpbin.exe /exports使用 .net System.Process 调用包装并解析结果?
纯粹的反射方法
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);
}
}
}