如何以编程方式检查C ++ DLL文件和C#DLL文件以获取对调试DLLS的引用,以自动执行测试过程

我遇到过这个问题太多次了,需要这个是一个自动化的方法:

我有多个DLL文件,这些文件经常被多个项目使用而构建/更改。

我创建了一个C#应用程序来检测DLL文件是否存在,并警告操作员是否存在并杀死程序。 在这个C#应用程序中,我希望它也检查以确定它是否是“调试”版本 – 换句话说,如果它在最终用户计算机上运行它会崩溃。

现在我一直在寻找高低,并找到了一些可能的解决方案,但它们都落空了。

Assembly.LoadFrom(string)不适用于非托管代码。 我可以使用它来测试托管DLL文件,但不测试C ++文件。

我想我可以使用Dependency Walker或类似的程序在我的应用程序中运行,以便为我提供程序集引用的数据,不幸的是, depends.exe控制台只输出到一个文件(然后我必须在每个文件中读取)文件和解析它为我的数据(非常密集加上我必须在我的项目中包括depends.exe和DLL文件)),此外,它似乎没有输出我真正想要的数据(或至少我不是能够做到)。

还尝试了dumpbin ,但我似乎无法让它在我的机器上运行。

我还发现了一些应该给我Dependency Walker源代码的链接。 不幸的是他们都死了。 我不认为这是一件难以做到的事情,但无论出于何种原因,我都很难弄清楚如何实现自动化。

一些对我有帮助的源链接,但没有一个解决了非托管程序集数据的问题。

  • 列出引用的程序集

  • 如何自动化集成测试? (堆栈溢出)

  • 确定.NET程序集是否已编译为debug

  • 如何判断.NET程序集是调试还是发布

  • 以编程方式检测发布/调试模式(.NET) (堆栈溢出)

  • 如何检测应用程序所需的DLL? (堆栈溢出)

  • 如何以编程方式检测程序集是否在调试或释放模式下编译

如果您知道所有DLL的名称(例如,因为您运行了Dependency Walker),您可以使用LoadLibrary来检查非托管DLL。

 [DllImport("kernel32.dll")] static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("kernel32.dll")] static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags); const UInt32 DONT_RESOLVE_DLL_REFERENCES = 0x00000001; const UInt32 LOAD_LIBRARY_AS_DATAFILE = 0x00000002; const UInt32 LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008; [DllImport("kernel32.dll")] static extern bool FreeLibrary(IntPtr hModule); [DllImport("kernel32.dll")] static extern UInt32 GetLastError(); void CheckUnmanagedDll(string DllName) { IntPtr hModule = LoadLibrary(DllName); if (hModule.Equals(IntPtr.Zero)) MessageBox.Show("Can't find " + DllName); FreeLibrary(hModule); } 

使用GetModuleHandle检查是否存在具有给定名称的DLL。 如果您想知道它是否是调试版本,那么您需要将该信息编译到EXE中并以某种方式检查它。 “调试”与“发布”不是PE格式内置的概念; 它只是一组编译选项。 许多人在版本信息中放置一个标志,以指示它是内部版本还是公共版本。

P / Invoke GetModuleHandle的引用