我有一个应用程序,它是一个游戏启动器。在应用程序运行时,我想遍历该文件中加载的 dll 并检查是否导出了某个函数。
我怎样才能做到这一点?
我不是在谈论使用网络反射器我想通过从游戏启动器加载到内存中的 dll 检查导出的函数,并循环遍历它们以查看是否调用了某个函数。
我有一个应用程序,它是一个游戏启动器。在应用程序运行时,我想遍历该文件中加载的 dll 并检查是否导出了某个函数。
我怎样才能做到这一点?
我不是在谈论使用网络反射器我想通过从游戏启动器加载到内存中的 dll 检查导出的函数,并循环遍历它们以查看是否调用了某个函数。
Jax,看看这个 StackOverflow 问题。它应该能够完全满足您的需求。为简单起见,请特别查看说明使用的注释Dumpbin.exe /exports
。这可能是最简单的方法。如果您绝对需要以编程方式执行此操作,请查看此 Stackoverflow 问题。
使用 Dumpbin 方法,您可以执行以下操作:
// The name of the DLL to output exports from
const string dllName = @"C:\Windows\System32\Wdi.dll";
string output = string.Empty;
var info = new ProcessStartInfo();
var process = new Process();
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
info.EnvironmentVariables.Remove("Path");
// DumpBin requires a path to IDE
info.EnvironmentVariables.Add("Path", Environment.GetEnvironmentVariable("Path") + @";c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\");
// Your path might be different below.
info.FileName = @"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\dumpbin.exe";
info.Arguments = string.Format("/exports \"{0}\"", dllName);
process.OutputDataReceived += (senderObject, args) => output = output + args.Data;
process.StartInfo = info;
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
// output now contains the output
使用 .net 反射。这是如何执行此操作的好示例:
http://towardsnext.wordpress.com/2008/09/17/listing-types-and-methods-of-assembly-reflection/