Wie überprüfe ich die DLL-Abhängigkeit?

165

Manchmal, wenn ich ein kleines Projekt mache, bin ich nicht vorsichtig genug und füge versehentlich eine Abhängigkeit für eine DLL hinzu, die mir nicht bekannt ist. Wenn ich dieses Programm an einen Freund oder andere Personen versende, "funktioniert es nicht", weil "eine DLL" fehlt. Dies liegt natürlich daran, dass das Programm die DLL auf meinem System finden kann, aber nicht auf ihrem.

Gibt es eine Möglichkeit , um eine ausführbare Datei für DLL - Abhängigkeiten oder führen Sie das Programm in einer „sauberen“ DLL-freien Umgebung zu scannen dem Zweck zu testen , diese zu verhindern oops Situationen?

orlp
quelle
2
Der Debugger zeigt jede DLL an, die im Ausgabefenster geladen wird. Das Debug + Windows + Modul zeigt eine Liste von ihnen. Stellen Sie sicher, dass Sie alle berücksichtigen können. Testen Sie Ihr Installationsprogramm so, wie Sie Ihren Code testen, und verwenden Sie eine VM.
Hans Passant
@ Hans Passant: Kann ich irgendwo eine vollständige Liste der Standard-Windows-DLLs finden?
Orlp
Ja, in c: \ windows \ system32 mit einem Microsoft-Copyright.
Hans Passant
2
@orlp - Sie könnten es auch versuchen dumpbin /dependents <program>. Ich vermute, die Liste ist relevanter als die Auflistung aller DLLs in %SYSTEM%oder %SYSTEM32%. Siehe auch DUMPBIN-Optionen auf MSDN.
JWW

Antworten:

103

Versuchen Sie es Dependency Walker(letztes Update im Jahr 2006) oder rufen Sie es modern um Dependencies.

Luchian Grigore
quelle
20
Ich habe gelesen, dass dies jetzt veraltet ist. Gibt es etwas aktuelleres?
TankorSmash
6
Wenn möglich, vertraue ich nur dem ursprünglichen Betriebssystemanbieter, da die ddl-Abhängigkeit ein Betriebssystemjob sein sollte. Kann dies ein Microsoft-Dienstprogramm tun? Kommandozeile ist in Ordnung für mich.
Robin Hsu
3
@RobinHsu: DependencyWalker wurde bis Visual Studio 2005 mit Visual Studio ausgeliefert. Der neueste Build ist im Windows Driver Development Kit enthalten (und nicht über die offizielle Website verfügbar). Immer noch kein offizielles Microsoft-Tool, aber von Microsoft genehmigt, beworben und beworben.
Unsichtbar
8
dumpbinüber Abhängigkeitsläufer. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437
kayleeFrye_onDeck
8
Es gibt jetzt eine Open-Source-Umschreibung, die teilweise in C # durchgeführt wurde. Treffen Sie " Dependencies.exe ": github.com/lucasg/Dependencies . Testeindruck: ein bisschen Beta-ish , aber es behandelt anscheinend API-Sets und SxS (fehlt in Dependency Walker).
Stein Åsmul
214

dumpbin Hier können die Tools von Visual Studio (Ordner VC \ bin) helfen:

dumpbin /dependents your_dll_file.dll
JeffRSon
quelle
7
Praktisches kleines Tool, und Sie müssen nichts Neues installieren, wenn Sie VS bereits installiert haben.
James
13
Ja, dumpbin.exeist sehr nützlich, um herauszufinden /dependentsund /imports. Sie können es auch auf anderen Computern verwenden, wenn Sie es kopieren link.exeund sicherstellen, dass die entsprechende x86 Visual C ++ Runtime Redistributable ( msvcr120.dllfür Visual Studio 2013) auf dem Zielcomputer verfügbar ist. Einige Optionen haben zusätzliche Abhängigkeiten. - Übrigens haben sie den Optionsnamen vermasselt, es hätte /PREREQUISITESeher sein sollen, als dass /DEPENDENTSsie Latein gelernt haben sollten.
Lumi
2
Es ist so großartig, dass wir dies als Überprüfungsschritt in unser Build-System aufgenommen haben, wenn die endgültige ausführbare Datei generiert wird, damit wir nicht von etwas abhängig sind, das nicht im Versand enthalten ist.
Lothar
4
Der einzige Nachteil ist, dass dieses praktische Tool sehr versteckt ist: c: \ Programme (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach
1
@rkachach Wenn Sie die Visual Studio-Befehlszeile (Extras -> Visual Studio-Eingabeaufforderung) öffnen, wird dies als externer Befehl erkannt und Sie müssen nur "dumpbin" eingeben.
Bemipefe
45

Ich kann Linux-Fans eine interessante Lösung empfehlen. Nachdem ich diese Lösung untersucht habe, habe ich von DependencyWalker zu dieser gewechselt.

Sie können Ihren Favoriten lddüber Windows verwenden exe,dll .

Dazu müssen Sie Cygwin (Grundinstallation, ohne zusätzliche Pakete erforderlich) unter Windows installieren und dann einfach starten Cygwin Terminal. Jetzt können Sie Ihre bevorzugten Linux-Befehle ausführen, darunter:

$ ldd your_dll_file.dll

UPD: Sie können es lddauch über das Git Bash Terminal unter Windows verwenden . Sie müssen cygwin nicht installieren, falls Sie git bereits installiert haben.

troyane
quelle
Ich habe gerade den Cygwin installiert und war froh, wieder Linux-Befehle zu finden, aber ich konnte nicht aus dem Cygwin-Stamm herauskommen, um auf andere Dateien auf meinem lokalen Laufwerk zuzugreifen (C :). Ist das normal?
ThomasGuenet
1
Ich denke, das könnte Ihnen helfen: stackoverflow.com/questions/1850920/…
troyane
4
Leider gibt es einige Abhängigkeiten, die auf diese Weise nicht gefunden werden : $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Der Utility-Dumpbin zeigt alle Abhängigkeiten korrekt an.
Fgiraldeau
5
Ich benutze ldd über das GIT BASH Terminal unter Windows und funktioniert einwandfrei. Wenn Sie also Git haben, ist es einfach, Cygwin nicht zu installieren. Beispiel: 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 / System. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov
1
Als jemand, der bereits Git Bash installiert hatte, war dies eine bevorzugte Lösung. Danke dir!
Nicolas
27
  1. Ermitteln Sie den vollständigen Dateipfad zu der Assembly, mit der Sie arbeiten möchten

  2. Drücken Sie die Starttaste und geben Sie "dev" ein. Starten Sie das Programm "Developer Command Prompt for VS 2017".

  3. Geben Sie im folgenden Fenster ein dumpbin /dependents [path], wo [path]sich der Pfad befindet, den Sie in Schritt 1 ermittelt haben

  4. Drücken Sie die Eingabetaste

Bam, du hast deine Abhängigkeitsinformationen. Das Fenster sollte folgendermaßen aussehen:

Geben Sie hier die Bildbeschreibung ein

Update für VS 2019: Sie benötigen dieses Paket in Ihrer VS-Installation:Geben Sie hier die Bildbeschreibung ein

Iamsodarncool
quelle
9
  1. Es gibt ein Programm namens "Depends"
  2. Wenn Sie cygwin installiert haben, ist nichts einfacher als ldd file.exe
Artyom
quelle
4
Das Tool heißt Dependency Walker . Das ausführbare Image heißt abhängige.exe .
Unsichtbar
7
Dependency Walker ist datiert. Sein letzter Bau ist im Jahr 2008!
SuB
dependsunterstützt keine API-Sets und ist daher für Win7 + nutzlos.
ivan_pozdeev
8

Am sichersten ist es, eine saubere virtuelle Maschine zu haben, auf der Sie Ihr Programm testen können. Stellen Sie bei jeder Version, die Sie testen möchten, den ursprünglichen Bereinigungswert der VM wieder her. Installieren Sie dann Ihr Programm mithilfe des Setups und prüfen Sie, ob es funktioniert.

DLL-Probleme haben unterschiedliche Gesichter. Wenn Sie Visual Studio verwenden und eine dynamische Verknüpfung zur CRT herstellen, müssen Sie die CRT-DLLs verteilen. Aktualisieren Sie Ihren VS, und Sie müssen eine andere Version der CRT verteilen. Es reicht nicht aus, nur die Abhängigkeiten zu überprüfen, da Sie diese möglicherweise verpassen. Eine vollständige Installation auf einem sauberen Computer ist die einzig sichere Lösung, IMO.

Wenn Sie keine vollständige Testumgebung einrichten möchten und Windows 7 verwenden möchten, können Sie den XP-Modus als ersten sauberen Computer und XP-More zum Duplizieren der VM verwenden.

eran
quelle
6

Auf Ihrem Entwicklungscomputer können Sie das Programm ausführen und den Sysinternals Process Explorer ausführen . Im unteren Bereich werden die geladenen DLLs und die aktuellen Pfade zu diesen angezeigt, was aus mehreren Gründen nützlich ist. Wenn Sie Ihr Bereitstellungspaket ausführen, wird angezeigt, auf welche DLLs im falschen Pfad verwiesen wird (dh welche nicht korrekt gepackt wurden).

Derzeit verwendet unser Unternehmen Visual Studio Installer-Projekte, um den Abhängigkeitsbaum zu durchsuchen und das Programm als lose Dateien auszugeben. In VS2013 ist dies jetzt eine Erweiterung: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Wir packen diese losen Dateien dann in ein umfassenderes Installationsprogramm, aber zumindest dieses Setup projiziert alle Punktnetzabhängigkeiten und legt sie an einer Stelle ab und warnt Sie, wenn Dinge fehlen.

Shiv
quelle
2

In der Vergangenheit (dh in WinXP-Tagen) war ich immer von DLL Dependency Walker (abhängige.exe) abhängig, aber manchmal kann ich die DLL-Probleme immer noch nicht ermitteln. Im Idealfall möchten wir dies vor der Laufzeit durch Inspektionen herausfinden. Wenn dies jedoch nicht behoben werden kann (oder zu viel Zeit in Anspruch nimmt), können Sie versuchen, den "Loader-Snap" wie unter http://blogs.msdn.com/ beschrieben zu aktivieren. b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failed.aspx und https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx und kurz erwähnt LoadLibrary schlägt fehl; GetLastError keine Hilfe

WARNUNG: Ich habe in der Vergangenheit mein Windows durcheinander gebracht und mit Gflag herumgespielt, sodass es auf die Knie kriecht. Sie wurden gewarnt.

Geben Sie hier die Bildbeschreibung ein

Hinweis: "Loader-Snap" ist pro Prozess, sodass die UI-Aktivierung nicht aktiviert bleibt (verwenden Sie cdb oder glfags -i).

HidekiAI
quelle
2

NDepend wurde bereits von Jesse erwähnt (wenn Sie .NET-Code analysieren), aber lassen Sie uns genau erklären, wie es helfen kann.

Gibt es ein Programm / Skript, das eine ausführbare Datei nach DLL-Abhängigkeiten durchsuchen oder das Programm in einer "sauberen" DLL-freien Umgebung ausführen kann, um diese Situationen zu testen?

Im Bereich "NDepend-Projekteigenschaften" können Sie definieren, welche Anwendungsassemblys analysiert werden sollen (grün). NDepend leitet dann Assemblys von Drittanbietern ab, die von Anwendungsassemblierungen verwendet werden (blau). Eine Liste der Verzeichnisse zum Durchsuchen von Anwendungen und Assemblys von Drittanbietern wird bereitgestellt.

NDepend-Projekteigenschaften Anwendung und Assemblys von Drittanbietern

Wenn in diesen Verzeichnissen keine Assembly eines Drittanbieters gefunden wird, befindet sie sich im Fehlermodus. Wenn ich beispielsweise das .NET Fx-Verzeichnis entferne, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319kann ich feststellen, dass .NET Fx-Assemblys von Drittanbietern nicht aufgelöst werden:

NDepend-Projekteigenschaften Anwendungs- und Drittanbieter-Assemblys wurden nicht aufgelöst

Haftungsausschluss: Ich arbeite für NDepend

Patrick vom NDepend-Team
quelle
1

Bitte suchen Sie "abhängige.exe" in Google, es ist ein winziges Dienstprogramm, um dies zu handhaben.

scheu yu
quelle
7
Beachten Sie, dass der Abhängigkeits-Walker ziemlich veraltet ist und mit 64-Bit nicht gut kooperiert. Es werden definitiv alle abhängigen DLLs angezeigt, wonach das OP sucht, aber es fügt auch Rauschen hinzu - Sie werden feststellen, dass in Ihrer 32-Bit-ausführbaren Datei einige 64-Bit-DLLs fehlen und so weiter ... Leider gibt es immer noch keine bessere Alternative.
eran
@eran Was ist jetzt? Gibt es jetzt eine bessere Alternative? Vielen Dank.
Nikos
@ RestlessC0bra Nicht das ich wüsste, aber ich habe in den letzten 5 Jahren keine Windows-Entwicklung durchgeführt. Dependency Walker ist mit Sicherheit tot, und es ist eine Schande, dass Microsoft sich weder die Mühe gemacht hat, dieses nützliche Tool zu aktualisieren, noch seine Quelle geöffnet hat, damit andere es am Leben erhalten können.
eran
1
@eran Nein DW ist nicht tot. Anscheinend wird es immer noch ausgiebig genutzt. Es gibt einige andere Tools, aber DW ist wahrscheinlich immer noch das beste.
Nikos
@ RestlessC0bra: Dependency Walker ist tot. 64-Bit-Module wurden nie eingeholt. Wenn Sie genau hinschauen, führt ein Großteil dieser umfangreichen Verwendung von Dependency Walker zu Fragen zum Stapelüberlauf, bei denen gefragt wird, warum etwas passiert. Das passiert aber nie. Es ist nur ein falsches Negativ / Positiv. Der Prozessmonitor sollte Ihr bevorzugtes Werkzeug sein.
Unsichtbarer
1

Wenn Sie den Quellcode haben, können Sie ndepend verwenden.

http://www.ndepend.com/

Es ist teuer und bietet viel mehr als nur die Analyse von Abhängigkeiten, sodass es für das, wonach Sie suchen, möglicherweise übertrieben ist.

Jesse
quelle
3
Analysiert es als speziell auf .NET zugeschnittenes Tool auch Abhängigkeiten für native Bilder?
Unsichtbar
Wahrscheinlich nicht, @IInspectable. Ich glaube nicht, dass .NET eine Möglichkeit hat, dies zu tun, außer möglicherweise etwas P-Invoke zu verwenden.
KayleeFrye_onDeck
@kayleeFrye_onDeck: Das Parsen von Importtabellen läuft darauf hinaus, Dateien zu lesen. .NET kann Dateien lesen.
Unsichtbarer
Ja! Und doch gibt es keine .NET-API, um dies zu tun :( Was schlagen Sie vor? Ich bin nicht wirklich ein .NET-Programmierer, sondern nur jemand, der es verwendet, wenn Lösungen auf niedrigerer Ebene nicht funktionieren. Es gibt eine anständige Auswahl an Inspektionstools Es gibt nur wenige für Windows, die verteilerfreundlich sind, geschweige denn schnell ... Ich wollte damit eine unbekannte Anzahl von Binärdateien rekursiv untersuchen, um beim Kompilieren verwendete Frameworks zu erkennen, damit ich sie mit speziellen Parametern behandeln kann. hoc. Ich muss möglicherweise LoadLibraryEx
prüfen, ob
1
@kayleeFrye_onDeck: Die Windows-API enthält auch nichts zum Lesen von Importtabellen von Modulen. Sie müssen Dateien lesen und den Inhalt analysieren. Kein Unterschied zwischen nativem Code und .NET. LoadLibraryExhilft da nicht.
Unsichtbarer
0

Das pedeps-Projekt ( https://github.com/brechtsanders/pedeps ) verfügt über ein Befehlszeilentool (copypedeps) zum Kopieren Ihrer EXE- (oder DLL-) Datei (en) zusammen mit allen Dateien, von denen es abhängt. Wenn Sie dies auf dem System tun, auf dem die Anwendung funktioniert, sollten Sie in der Lage sein, sie mit allen abhängigen DLLs zu versenden.

Brecht Sanders
quelle