如何检测dll的类型? (COM,.NET,WIN32)

时间:2009-09-14 10:22:20

标签: .net com dll file

我需要在文件夹中处理一些dll和exe文件,并确定我正在处理的文件类型:.NET,COM,Win32或其他一些外星生命形式。

我一直在尝试确定检测DLL类型的最简单方法,你怎么看待这个:

  1. COM dll =>我做了一个LoadLibrary,然后是“ DllRegisterServer ”的GetProcAddress。如果我得到有效的回报,那就是一个COM文件。

  2. .NET dll =>如果dll依赖于 MSCOREE.DLL ,它总是一个.NET dll?

  3. Win32 dll =>如果上述两个测试都失败了,那就是Win32 dll?

  4. 当然必须有更好的方法来检测我们正在处理的dll类型。以上是非常笨重的,并不适用于EXE文件?必须有一些我没想到的其他方式。

    理想情况下,我希望能够让解析器确定编译文件的编译器,以及它使用的功能,如MFC,Atl,Stl等......但我怀疑在预反射中是否可行时代?

3 个答案:

答案 0 :(得分:5)

您必须检查这些文件的PE标头。所有DLL和可执行文件,Win32和.NET都有一个PE头。

An In-Depth Look into the Win32 Portable Executable File Format

The .NET File Format

Portable Executable

答案 1 :(得分:5)

不需要DllRegisterServer,COM dll唯一需要的导出是DllGetClassObject

答案 2 :(得分:1)

我没有看到更好的方法。然而,在2.,实际上答案是否定的。运行时主机几乎肯定也依赖于mscoree.dll,而那些不一定是.Net程序集。

.Net dll有一个COM描述符,您可以使用dumpbin找到它。我不知道如何从代码中获取这些信息。

如果您使用.Net编程,确定程序集是否为.Net程序集的一种方法是尝试调用Assembly.LoadFrom(...)。

嗯,这不是一个真正的答案,而是一系列我要研究的事情提示。