列出 C# 中的 non-.NET DLL 函数

List non-.NET DLL functions from C#

本文关键字:DLL 函数 NET non- 中的 列出      更新时间:2023-10-16

我有一个C++DLL,我正在使用DllImportedLoadLibrary将其导入到C#项目中。

class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllToLoad);
static void Main(string[] args)
{
IntPtr library = LoadLibrary(@"MyDll.dll");
if (library == IntPtr.Zero)
{
var err = Marshal.GetLastWin32Error();
throw new Exception($"Library load error, code {err}");
}
}
}

我现在要枚举从此 DLL 导出的函数。我已经看到了这个问题,但它适用于C++,我不确定如何在 C# 中做同样的事情。

解析dumpbin /exports的输出可能会起作用,但我想知道是否有更具体的方法来首先做到这一点。

如何从 C# 获取 C++ DLL 中所有函数的列表?

在Remy Lebeau的评论为我指出了正确的方向之后,我寻找了PE解析器并找到了PeNet。它做得很好,并揭示了大量信息,而不仅仅是导出的功能。

它位于 NuGet 上,因此只需安装它,将using PeNet添加到文件顶部,然后使用如下所示的代码:

var pe = new PeFile(@"MyDll.dll");
var functions = pe.ExportedFunctions.Select(x => x.Name).ToList();

这里有一篇关于如何从文件中读取 PE 标头的好文章: https://blogs.msdn.microsoft.com/kstanton/2004/03/31/exploring-pe-file-headers-using-managed-code/

您需要检查 .edata 部分以查找导出: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85(.aspx#the_.edata_section__image_only_