2009-09-14 3 views
13

J'ai besoin de traiter un certain nombre de fichiers dll et exe dans un dossier et déterminer quel type de fichier que j'ai affaire: .NET, COM, Win32 ou une autre forme de vie extraterrestre.Comment puis-je détecter le type d'une DLL? (COM, .NET, WIN32)

J'ai essayé de déterminer la meilleure façon de détecter le type d'une DLL, que pensez-vous de ceci:

  1. dll COM => Je fais LoadLibrary, puis GetProcAddress pour "DllRegisterServer". Si je reçois un retour valide, c'est un fichier COM.

  2. dll .NET => Si le dll dépend de MSCOREE.DLL il est toujours une dll .NET?

  3. Win32 dll => Si les deux tests ci-dessus échouent, il est une dll Win32?

Sûrement il doit y avoir une meilleure façon de détecter le type de dll que nous traitons. Ce qui précède est très maladroit, et ne fonctionnera pas pour les fichiers EXE? Il doit y avoir un autre moyen auquel je ne pense pas.

Idéalement, j'aimerais pouvoir faire en sorte que l'analyseur détermine avec quel compilateur le fichier a été compilé, et quelles fonctions il utilise telles que MFC, Atl, Stl etc ... Mais je doute que cela soit possible dans le pré- ère de la réflexion?

Répondre

1

Je ne vois pas une meilleure façon de le faire. Cependant, à 2., en réalité la réponse est non. Les hôtes d'exécution dépendront certainement aussi de mscoree.dll, et ceux-ci ne sont pas nécessairement des assemblys .Net.

Les dllsNet ont un descripteur COM, que vous pouvez trouver en utilisant dumpbin. Je ne sais pas comment obtenir cette information du code.

Si vous programmez en .Net, une façon de déterminer si l'assembly est un assembly .Net consiste à essayer d'appeler Assembly.LoadFrom (...).

Eh bien, ce n'est pas une vraie réponse, mais un ensemble de conseils que je voudrais examiner.

+0

Salut, merci. J'ai utilisé l'approche "essayer de charger l'assemblage" avant - mais il semble terriblement maladroit n'est-ce pas? On dirait que j'ai besoin de descendre la route PE. Peut-être un bon composant réutilisable. J'espérais qu'il y avait une fonctionnalité cachée dans les bibliothèques pour le faire, mais devinez pas. –

+0

Oui, il semble terriblement maladroit ... yyucckckk! :-) Bonne chance! –

4

DllRegisterServer n'est pas nécessaire, la seule nécessaire exportation pour une dll COM est DllGetClassObject

Questions connexes