Come posso rilevare le DLL richieste da un’applicazione?

In poche parole: voglio fare la stessa cosa “Dipendenza Walker”.

C’è qualche funzione API Win32 che può enumerare le dipendenze di un file EXE e / o DLL?

E c’è un modo sicuro per rilevare le dipendenze dalle classi ActiveX? (Dubito che sia ansible, ma chi lo sa …)

EDIT: Sono a conoscenza degli strumenti disponibili che forniscono le stesse funzionalità di base (Dependency Walker, ProcessExplorer, AQTime, …) ma voglio creare il mio programma che scarica un file di testo contenente i moduli richiesti.

Sembra che il codice sorgente di Dependency Walker sia stato fornito da Microsoft tramite MSJ. Per favore guarda Re: [DUG]: Dipendenza Walker .

È necessario fare riferimento ad un altro sito da scaricare poiché il collegamento fornito in questo percorso non funziona.

Controllare gli aggiornamenti del codice sorgente MSJ : Poiché non ho tempo, non ho controllato se contiene codice sorgente o solo file EXE.

I seguenti comandi eseguono il dump delle dipendenze dirette di some.exe:

dumpbin /imports some.exe 

Funziona anche su DLL.

Questo non elenca le dipendenze come i plugin caricati all’avvio dell’applicazione (tramite chiamate LoadLibrary). Lo stesso vale per le dipendenze COM poiché funzionano allo stesso modo (per quanto ne so).

Se è necessario conoscere tutte le DLL utilizzate da un programma in esecuzione, utilizzare ProcessExplorer.

findstr -i .dll exe.exe | altro | findstr -i .dll | Di Più

rem 🙂

Avvia l’applicazione, con Process Explorer già in esecuzione e imposta il filtro per il nome .exe dell’applicazione.

Non esiste alcun modo per rilevare tutte le dipendenze COM di un eseguibile senza eseguirlo.

Probabilmente è necessario percorrere la struttura dei file dell’eseguibile per risolverlo programmaticamente. Quindi qualcosa come il programma “PE Dump” menzionato qui: http://msdn.microsoft.com/en-gb/magazine/cc301808.aspx sarebbe un buon punto di partenza. Il codice effettivo di cui hai bisogno può essere trovato qui: http://www.wheaty.net/downloads.htm

User @blue … eluso su Dependency Walker . Quando si utilizza Dependency Walker, dopo aver aperto il file è ansible visualizzare i requisiti di base utilizzati. Solo durante l’esecuzione del programma e nell’esercizio di tutte le sue funzioni è ansible trovare tutte le DLL caricate dynamicmente.

A volte la cosa migliore da fare se puoi è chiedere allo sviluppatore quali sono le DLL richieste. Un’applicazione può caricare solo alcune DLL quando assolutamente necessario. Ad es. Caricamento di faultrep.dll, per Segnalazione errori di Windows personalizzata, quando sta per bloccarsi.

Puoi scrivere un’app console per concludere l’operazione, creare uno script PowerShell con esso o, come faccio di solito fin da quando devo farlo solo una volta in una luna blu, aggiungi quanto segue al tuo codice per un controllo veloce:

  private static HashSet ReferencedAssemblies = new HashSet(); ... OutputDependencies(Assembly.GetAssembly(typeof(Program)), 0); ... static void OutputDependencies(Assembly assembly, int indent) { if (assembly == null) return; Console.WriteLine(new String(' ', indent * 4) + assembly.FullName); if (!ReferencedAssemblies.Contains(assembly.FullName)) { ReferencedAssemblies.Add(assembly.FullName); foreach (var childAssembly in assembly.GetReferencedAssemblies()) { OutputDependencies(Assembly.Load(childAssembly.FullName), indent + 1); } } }