我需要解析普通的 Win32 DLL/Exe 并从中获取所有导入和导出以显示在控制台或 GUI(即 Win Forms)上。是否可以通过读取其导出/导入表并从中获取托管类型来解析 C#.NET 中的 Win32 DLL/Exe?由于它是非托管 PE,.NET 不允许您将非托管 PE 文件转换为托管 .NET 程序集,它只生成 COM 托管程序集。
如何解析这些表并以托管形式获取其所有方法(签名)。(例如,如果 char* 作为参数,它应该显示为 IntPtr)。
我需要解析普通的 Win32 DLL/Exe 并从中获取所有导入和导出以显示在控制台或 GUI(即 Win Forms)上。是否可以通过读取其导出/导入表并从中获取托管类型来解析 C#.NET 中的 Win32 DLL/Exe?由于它是非托管 PE,.NET 不允许您将非托管 PE 文件转换为托管 .NET 程序集,它只生成 COM 托管程序集。
如何解析这些表并以托管形式获取其所有方法(签名)。(例如,如果 char* 作为参数,它应该显示为 IntPtr)。
查看 .Net 的 PeNet 库。它可以解析并列出 DLL 的所有导出/导入。您可以从 github 或直接作为 NuGet 包获取它。https://github.com/secana/PeNet https://www.nuget.org/packages/PeNet/
(免责声明:我是该项目的作者)
至于您问题的第二部分,即获取方法签名,这通常是不可能的。该信息通常不存储在 PE 本身中。对于 C++ 函数,这是可能的,因为损坏的名称将对该信息进行编码,但许多 DLL 不公开 C++ 接口。对于 COM 接口,此信息存储在类型库中,通常作为资源嵌入到 PE 中。要查看您想到的特定 dll 是否可以这样做,您可以使用 dumpbin 和 undec 来查看这些函数是否是 C++ 错位名称。如果没有,您将需要一些其他信息源,如头文件来创建正确的 P/Invoke 签名(在这种情况下,您可能不需要解析 PE 文件)。
使用Microsoft Portable Executable Specification Document可以解析 PE 文件。但是,正如 Logan 所指出的,签名不包含在 PE 文件中。仅包含导出函数的名称。
更新:如果您的 dll 是由 Microsoft 的 C++ 编译器的最新版本创建的 C++ dll,那么您可以通过调用此函数取消修饰损坏的名称以获取大部分签名:UnDecorateSymbolName from Debugging Tools for Windows。但是,返回值不包含在损坏的名称中。