2009-09-14 15 views
13

Necesito procesar una cantidad de archivos dll y exe en una carpeta y determinar con qué tipo de archivo estoy tratando: .NET, COM, Win32 u otro formulario de vida extraterrestre.¿Cómo puedo detectar el tipo de un dll? (COM, .NET, WIN32)

He estado tratando de determinar la mejor manera de detectar el tipo de un archivo DLL, ¿qué opinas de esto:

  1. COM DLL => hago un LoadLibrary, entonces GetProcAddress para "DllRegisterServer". Si obtengo una devolución válida, es un archivo COM.

  2. .NET DLL => Si el archivo DLL depende de MsCorEE.dll siempre es una DLL .NET?

  3. Win32 DLL => Si tanto las pruebas anteriores fallan, es una DLL de Win32?

Seguramente debe haber una mejor manera de detectar qué tipo de dll estamos tratando. Lo anterior es muy torpe, y no funcionará para los archivos EXE? Debe haber alguna otra forma en la que no estoy pensando.

Idealmente, me gustaría poder hacer que el analizador determine con qué compilador se compiló el archivo, y qué características usa, como MFC, Atl, Stl, etc. ... Pero dudo que eso sea posible en el Era de reflexión?

Respuesta

1

no veo una mejor forma de hacerlo. Sin embargo, en 2., en realidad la respuesta es no. Los hosts de tiempo de ejecución casi seguramente también dependerán de mscoree.dll, y esos no son necesariamente ensamblados de .Net.

.Net dlls tiene un descriptor COM, que puede encontrar utilizando dumpbin. No sé cómo obtener esta información del código.

Si está programando en .Net, una forma de determinar si el conjunto es un conjunto .Net es tratando de llamar a Assembly.LoadFrom (...).

Bueno, esta no es una respuesta real, sino una serie de consejos que consideraría. No se requiere

+0

Hola, gracias. He usado el enfoque de "intentar cargar ensamblaje" antes, pero parece terriblemente torpe ¿no? Parece que necesito ir por la ruta PE. Puede ser un buen componente reutilizable. Esperaba que hubiera una función oculta en las bibliotecas para hacer esto, pero supongo que no. –

+0

Sí, parece terriblemente torpe ... yyucckckk! :-) ¡Buena suerte! –

4

DllRegisterServer, la exportación sólo se requiere para un archivo DLL COM es DllGetClassObject

Cuestiones relacionadas