.net – How to detect the type of a dll? (COM, .NET, WIN32)

comdllfilenet

I need to process a number of dll's and exe files in a folder and determine what type of file I am dealing with: .NET, COM, Win32 or some other alien life form.

I've been trying to determine the easiest way to detect the type of a DLL, what do you think of this:

  1. COM dll
    => I do a LoadLibrary, then GetProcAddress for "DllRegisterServer". If I get a valid return, it's a COM file.

  2. .NET dll
    => If the dll depends on MSCOREE.DLL it's always a .NET dll?

  3. Win32 dll
    => If both the above tests fail, it's a Win32 dll?

Surely there must be a better way to detect what type of dll we are dealing with. The above is very clunky, and won't work for EXE files? There must be some other way that I am not thinking of.

Ideally I'd like to be able to make the parser determine what compiler the file was compiled with, and what features it uses such as MFC, Atl, Stl etc… But I doubt that's possible in the pre-reflection era?

Best Answer

You must check the PE Header of these files. All DLL and executables, Win32 and .NET, have a PE header.

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

The .NET File Format

Portable Executable