Come verificare la dipendenza da DLL?


167

A volte quando sto facendo un piccolo progetto non sono abbastanza attento e aggiungo accidentalmente una dipendenza per una DLL di cui non sono a conoscenza. Quando invio questo programma ad un amico o ad altre persone, "non funziona" perché manca "alcune DLL". Questo ovviamente perché il programma può trovare la DLL sul mio sistema, ma non sul loro.

Esiste un modo per eseguire la scansione di un eseguibile per le dipendenze DLL o eseguire il programma in un ambiente "pulito" privo di DLL per i test per prevenire queste situazioni di oops ?


2
Il debugger mostra ogni DLL che viene caricata nella finestra Output. I moduli Debug + Windows + mostrano un elenco di essi. Assicurati di poterti rendere conto di tutti loro. E prova il tuo programma di installazione come se stessi testando il tuo codice, usa una VM.
Hans Passant,

@Hans Passant: posso trovare un elenco completo delle DLL standard di Windows da qualche parte?
orlp,

Sì, in c: \ windows \ system32 con un copyright Microsoft.
Hans Passant,

2
@orlp - Potresti anche provare dumpbin /dependents <program>. Immagino che l'elenco sarà più pertinente dell'elenco di tutte le DLL in %SYSTEM%o %SYSTEM32%. Vedi anche Opzioni DUMPBIN su MSDN.
JWW

Risposte:


106

Prova Dependency Walker(ultimo aggiornamento nel 2006) o una sua riscrittura moderna chiamata Dependencies.


20
Ho letto che questo è ormai datato, c'è qualcosa di più attuale?
TankorSmash,

6
Se possibile, mi fiderò solo del fornitore del sistema operativo originale, poiché la dipendenza ddl dovrebbe essere un lavoro del sistema operativo. Qualche programma di utilità Microsoft può farlo? La riga di comando va bene per me.
Robin Hsu,

3
@RobinHsu: DependencyWalker veniva fornito con Visual Studio fino a Visual Studio 2005. La build più recente è inclusa nel Kit di sviluppo driver di Windows (e non è disponibile attraverso il sito Web ufficiale). Non è ancora ufficialmente uno strumento Microsoft, ma sanzionato, promosso e pubblicizzato da Microsoft.
Indispensabile


8
Ora c'è una riscrittura open source parzialmente eseguita in C #, incontra " Dependencies.exe ": github.com/lucasg/Dependencies . Impressione del test: un po 'beta-ish , ma a quanto pare gestisce API-set e SxS (mancanti da Dependency Walker).
Stein Åsmul,

219

dumpbin dagli strumenti di Visual Studio (cartella VC \ bin) può aiutare qui:

dumpbin /dependents your_dll_file.dll

7
Piccolo strumento pratico e risparmia di dover installare qualcosa di nuovo quando hai già installato VS.
James,

13
Sì, dumpbin.exeè molto utile da capire /dependentse /imports. È inoltre possibile utilizzarlo su altri computer se si copia link.exeinsieme ad esso e assicurarsi che il corrispondente ridistribuibile runtime di Visual C ++ x86 ( msvcr120.dllper Visual Studio 2013) sia disponibile sul computer di destinazione. Alcune opzioni hanno dipendenze aggiuntive. - A proposito, hanno rovinato il nome dell'opzione, avrebbe dovuto essere /PREREQUISITESpiuttosto che /DEPENDENTS, avrebbero dovuto studiare il latino.
Lumi,

2
È fantastico, l'abbiamo aggiunto nel nostro sistema di build come passaggio di verifica quando viene generato l'eseguibile finale, quindi non dipendiamo da qualcosa che non è incluso nella spedizione.
Lothar,

4
L'unico inconveniente è che questo pratico strumento è molto nascosto: c: \ Programmi (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach Se apri la riga di comando di Visual Studio (Strumenti -> Prompt dei comandi di Visual Studio), questo viene riconosciuto come comando esterno e devi solo digitare "dumpbin".
Bemipefe,

46

Posso consigliare una soluzione interessante per i fan di Linux. Dopo aver esplorato questa soluzione, sono passato da DependencyWalker a questo.

È possibile utilizzare il vostro preferito lddrispetto a Windows-related exe, dll.

Per fare questo è necessario installare Cygwin (installazione di base, senza pacchetti aggiuntivi richiesti) su Windows e quindi avviare Cygwin Terminal. Ora puoi eseguire i tuoi comandi Linux preferiti, tra cui:

$ ldd your_dll_file.dll

UPD: è possibile utilizzare lddanche tramite il terminale git bash su Windows . Non è necessario installare Cygwin nel caso in cui Git sia già installato.


Ho appena installato Cygwin ed ero felice di trovare indietro i comandi di Linux, ma non sono riuscito a uscire dal root Cygwin per accedere ad altri file sul mio disco locale (C :). È normale?
ThomasGuenet,

1
Penso che questo potrebbe aiutarti: stackoverflow.com/questions/1850920/…
troyane

4
Purtroppo, ci sono alcune dipendenze che non si trovano in questo modo: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Il dumpbin dell'utilità mostra correttamente tutte le dipendenze.
fgiraldeau,

5
Uso ldd tramite il terminale GIT BASH su Windows e funziona benissimo. Quindi, se hai git, sarà facile, non è necessario installare Cygwin. Esempio: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov

1
Come qualcuno che aveva già installato Git Bash, questa era una soluzione preferibile. Grazie!
Nicolas

28
  1. Scopri il percorso completo del file per l'assembly con cui stai tentando di lavorare

  2. Premere il pulsante di avvio, digitare "dev". Avvia il programma chiamato "Prompt dei comandi per sviluppatori per VS 2017"

  3. Nella finestra che si apre, digita dumpbin /dependents [path], dove si [path]trova il percorso che hai capito nel passaggio 1

  4. premere il tasto invio

Bam, hai le tue informazioni sulla dipendenza. La finestra dovrebbe apparire così:

inserisci qui la descrizione dell'immagine

Aggiornamento per VS 2019: è necessario questo pacchetto nell'installazione VS:inserisci qui la descrizione dell'immagine


9
  1. Esiste un programma chiamato "Dipende"
  2. Se hai installato cygwin, niente di più semplice di ldd file.exe

4
Lo strumento si chiama Dependency Walker ; la sua immagine eseguibile si chiama depend.exe .
Indispensabile

7
Dipendenza Walker è datata. La sua ultima costruzione è nel 2008!
SuB,

dependsnon supporta i set di API, quindi è inutile per Win7 +.
ivan_pozdeev,

8

La cosa più sicura è avere una macchina virtuale pulita, su cui è possibile testare il programma. Su ogni versione che desideri testare, ripristina la VM al suo valore iniziale pulito. Quindi installare il programma usando la sua configurazione e vedere se funziona.

I problemi della dll hanno facce diverse. Se si utilizza Visual Studio e si collega dinamicamente al CRT, è necessario distribuire le DLL CRT. Aggiorna il tuo VS e devi distribuire un'altra versione del CRT. Il solo controllo delle dipendenze non è sufficiente, poiché potresti non vederle. Fare un'installazione completa su una macchina pulita è l'unica soluzione sicura, IMO.

Se non si desidera configurare un ambiente di test completo e avere Windows 7, è possibile utilizzare XP-Mode come macchina pulita iniziale e XP-More per duplicare la VM.


6

Sul tuo computer di sviluppo, puoi eseguire il programma ed eseguire Sysinternals Process Explorer . Nel riquadro inferiore, ti mostrerà le DLL caricate e i loro percorsi attuali che è utile per una serie di motivi. Se si sta eseguendo il pacchetto di distribuzione, rivelerebbe quali DLL fanno riferimento nel percorso errato (ovvero non sono state impacchettate correttamente).

Attualmente, la nostra azienda utilizza i progetti del programma di installazione di Visual Studio per percorrere l'albero delle dipendenze e generare come file liberi il programma. In VS2013, questa è ora un'estensione: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Quindi impacchettiamo questi file sciolti in un programma di installazione più completo, ma almeno quell'impostazione proietta tutte le dipendenze di net dot e li rilascia in un punto e ti avverte quando mancano delle cose.


2

In passato (ad es. Giorni WinXP), dipendevo / dipendevo dal Dipendente DLL Walker (depend.exe) ma ci sono volte in cui non sono ancora in grado di determinare i problemi DLL. Idealmente, vorremmo scoprire prima del runtime dalle ispezioni, ma se ciò non lo risolve (o impiegando troppo tempo), puoi provare ad abilitare lo "snap del caricatore" come descritto su http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx e https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx e brevemente citato LoadLibrary fallisce; GetLastError nessun aiuto

ATTENZIONE: in passato ho fatto un casino con Windows, scherzando con gflag facendolo strisciare in ginocchio, sei stato avvisato.

inserisci qui la descrizione dell'immagine

Nota: "Snap caricatore" è per processo, quindi l'abilitazione dell'interfaccia utente non rimarrà selezionata (utilizzare cdb o glfags -i)


2

NDepend è già stato menzionato da Jesse (se si analizza il codice .NET) ma spiega esattamente come può essere d'aiuto.

Esiste un programma / script in grado di eseguire la scansione di un eseguibile alla ricerca di dipendenze DLL o eseguire il programma in un ambiente "pulito" privo di DLL per i test per prevenire queste situazioni di oops?

Nel pannello Proprietà progetto NDepend, è possibile definire quali sono gli assembly dell'applicazione da analizzare (in verde) e NDepend inferirà gli assembly di terze parti utilizzati da quelli dell'applicazione (in blu). Viene fornito un elenco di directory in cui cercare applicazioni e assiemi di terze parti.

Applicazione di proprietà del progetto NDepend e assiemi di terze parti

Se un assembly di terze parti non viene trovato in queste directory, sarà in modalità errore. Ad esempio, se rimuovo la directory di .NET Fx, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319vedo che gli assembly di terze parti di .NET Fx non vengono risolti:

Applicazione di proprietà del progetto NDepend e assiemi di terze parti non risolti

Disclaimer: lavoro per NDepend


1

Cerca "depend.exe" in google, è una piccola utility per gestirlo.


7
Si noti che il walker delle dipendenze è piuttosto datato e non coopera bene con 64 bit. Mostrerà definitivamente tutte le DLL dipendenti, che è ciò che l'OP sta cercando, ma aggiunge anche rumore: scoprirai che sei eseguibile a 32 bit mancando alcune dll a 64 bit e così via ... Purtroppo, non c'è ancora niente di meglio alternativa.
eran,

@eran E adesso? Esiste un'alternativa migliore adesso? Grazie.
Nikos,

@ RestlessC0bra Non che io sappia, ma non ho fatto lo sviluppo di Windows negli ultimi 5 anni. Il walker delle dipendenze è sicuramente morto, ed è un peccato che Microsoft non si sia preoccupata di aggiornare questo utile strumento né ne abbia aperto la fonte in modo che altri possano mantenerlo in vita.
Eran,

1
@eran No DW non è morto. Apparentemente è ancora ampiamente utilizzato. Esistono altri strumenti, ma DW è probabilmente il migliore.
Nikos,

@ RestlessC0bra: Dependency Walker è morto. Non ha mai raggiunto i moduli a 64 bit. Se guardi abbastanza da vicino, gran parte di quell'ampio uso di Dependency Walker porta a domande Stack Overflow, chiedendo perché sta succedendo qualcosa. Che qualcosa non accada mai, comunque. È solo un falso negativo / positivo. Process Monitor dovrebbe essere il tuo strumento preferito.
IIprevedibile

1

Se hai il codice sorgente, puoi usare ndepend.

http://www.ndepend.com/

È costoso e fa molto di più che analizzare le dipendenze, quindi potrebbe essere eccessivo per quello che stai cercando.


3
Essendo uno strumento su misura per .NET, analizza anche le dipendenze per le immagini native?
Probabile

Probabilmente no, @IInspectable. Non credo che .NET abbia un modo per farlo, tranne forse usando qualcosa di P-Invoke.
kayleeFrye_onDeck,

@kayleeFrye_onDeck: l'analisi delle tabelle di importazione si riduce alla lettura dei file. .NET può leggere i file.
II

Sì! Eppure, non esiste un'API .NET per fare questo :( Cosa suggerisci? Non sono davvero un programmatore .NET, solo qualcuno che lo usa quando le soluzioni di livello inferiore non eseguono il pan out. C'è una buona selezione di strumenti di ispezione là fuori, ma pochissimi per Windows sono facili da distribuire, figuriamoci veloci ... Stavo cercando di usarlo per ispezionare ricorsivamente una quantità sconosciuta di binari per rilevare i framework utilizzati durante la compilazione, in modo da poterli trattare con parametri speciali ad- potrebbe essere necessario esaminare l'utilizzoLoadLibraryEx ...
kayleeFrye_onDeck il

1
@kayleeFrye_onDeck: nell'API di Windows non è presente nulla per leggere le tabelle di importazione dei moduli. Devi leggere i file e analizzarne il contenuto. Nessuna differenza tra codice nativo e .NET. LoadLibraryExnon aiuta lì.
IIprevedibile

0

Il progetto pedeps ( https://github.com/brechtsanders/pedeps ) ha uno strumento da riga di comando (copypedeps) per copiare i file .exe (o .dll) insieme a tutti i file da cui dipende. Se lo fai sul sistema in cui funziona l'applicazione, dovresti essere in grado di spedirlo con tutte le sue DLL di dipendenza.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.