2009-09-14 9 views
13

Ho bisogno di elaborare un numero di file dll ed exe in una cartella e determinare il tipo di file con cui ho a che fare: .NET, COM, Win32 o qualche altra forma di vita aliena.Come posso rilevare il tipo di una dll? (COM, .NET, WIN32)

Ho cercato di determinare il modo più semplice per rilevare il tipo di una DLL, cosa ne pensi di questo:

  1. COM dll => faccio un LoadLibrary, poi GetProcAddress per "DllRegisterServer". Se ottengo un ritorno valido, è un file COM.

  2. dll .NET => Se la DLL dipende MSCOREE.DLL è sempre una dll .NET?

  3. DLL Win32 => Se entrambi i test precedenti non riescono, è una DLL Win32?

Sicuramente ci deve essere un modo migliore per rilevare quale tipo di dll abbiamo a che fare. Quanto sopra è molto goffo e non funzionerà con i file EXE? Ci deve essere un altro modo in cui non sto pensando.

Idealmente mi piacerebbe essere in grado di fare in modo che il parser determini con quale compilatore il file è stato compilato, e quali caratteristiche utilizza come MFC, Atl, Stl ecc ... Ma dubito che sia possibile nel pre era di riflessione?

risposta

1

Non vedo un modo migliore di farlo. Tuttavia, a 2., in realtà la risposta è no. Gli host di runtime dipenderanno quasi certamente anche da mscoree.dll e quelli non sono necessariamente. Assiemi .Net.

. Le DLL di rete hanno un descrittore COM, che è possibile trovare utilizzando dumpbin. Non so come ottenere queste informazioni dal codice.

Se si sta programmando in .Net, un modo per determinare se l'assembly è un. Assieme Net tenta di chiamare Assembly.LoadFrom (...).

Bene, questa non è una risposta reale, ma una serie di suggerimenti su cose che vorrei esaminare.

+0

Ciao, grazie. Ho usato l'approccio "prova a caricare l'assembly" prima - ma sembra terribilmente clunky no? Sembra che ho bisogno di andare lungo la rotta PE. Potrebbe essere una buona componente riutilizzabile. Speravo che esistesse una funzionalità nascosta nelle biblioteche per fare ciò, ma non credo. –

+0

Sì, sembra terribilmente goffo ... yyucckckk! :-) In bocca al lupo! –

4

DllRegisterServer non è richiesto, l'esportazione unica richiesta per una dll COM è DllGetClassObject