it-swarm.it

Come verificare la dipendenza DLL?

A volte quando sto facendo un piccolo progetto non sono abbastanza attento e aggiungo accidentalmente una dipendenza per un 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 DLL sul mio sistema, ma non sul loro.

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

133
orlp

Prova Walker dipendenze: http://www.dependencywalker.com/

81
Luchian Grigore

dumpbin dagli strumenti di Visual Studio (cartella VC\bin) può essere d'aiuto qui:

dumpbin /dependents your_dll_file.dll
168
JeffRSon

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

Puoi utilizzare il tuo preferito lddNAME _ su exerelativo a Windows, dllname__.

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: Puoi usare lddanche attraverso git bash terminal su Windows . Non è necessario installare Cygwin nel caso in cui Git sia già installato.

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

  2. Scopri il percorso completo del file per l'Assemblea con cui stai cercando di lavorare

  3. Nella finestra che si apre, digita dumpbin /dependents [path], dove [path] è il percorso che hai individuato nel passaggio 2

  4. premere il tasto invio

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

enter image description here

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

La cosa più sicura è avere una macchina virtuale pulita, su cui è possibile testare il programma. Su ogni versione che desideri testare, ripristina VM sul 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.

8
eran

Sulla tua macchina 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.

6
Shiv

In passato (ovvero giorni WinXP), dipendevo/affidavo a DLL Dependency Walker (depend.exe) ma ci sono momenti in cui non sono ancora in grado di determinare DLL problemi). 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 menzionato LoadLibrary non riesce; GetLastError nessun aiuto

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

enter image description here

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

2
HidekiAI

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

1
shiying yu

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 DLL dipendenze 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.

NDepend Project Properties Application and Third-Party assemblies

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

NDepend Project Properties Application and Third-Party assemblies not resolved

Disclaimer: lavoro per NDepend

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.

1
Jesse