Wie bestimme ich die Abhängigkeiten einer .NET-Anwendung?


106

Wie bestimme ich die Abhängigkeiten einer .NET-Anwendung? Funktioniert Dependency Walker mit verwalteten Apps? Ich habe die neueste Version heruntergeladen und versucht, die App zu profilieren, aber sie wird nur ohne große Erklärung beendet. Wenn es mit .NET nicht funktioniert, gibt es dann ein anderes Tool, mit dem ich ein Problem beim Laden von DLL zur Laufzeit beheben kann?

Antworten:


94

Dependency Walker funktioniert mit normalen Win32-Binärdateien. Alle .NET-DLLs und -Exe haben einen kleinen Stub-Header-Teil, der sie wie normale Binärdateien aussehen lässt, aber im Grunde heißt es nur "Laden der CLR" - das ist alles, was der Abhängigkeits-Walker Ihnen sagen wird.

Um zu sehen, auf welche Dinge sich Ihre .NET-App tatsächlich stützt, können Sie den hervorragenden .NET-Reflektor von Red Gate verwenden. (BEARBEITEN: Beachten Sie, dass .NET Reflector jetzt ein kostenpflichtiges Produkt ist. ILSpy ist kostenlos und Open Source und sehr ähnlich.)

Laden Sie Ihre DLL hinein, klicken Sie mit der rechten Maustaste und wählen Sie "Analysieren". Anschließend wird ein Element "Abhängig von" angezeigt, in dem alle anderen benötigten DLLs (und Methoden in diesen DLLs) angezeigt werden.

Es kann manchmal schwieriger werden, da Ihre App von der X-DLL abhängt und die X-DLL vorhanden ist, aber aus irgendeinem Grund nicht zur Laufzeit geladen oder gefunden werden kann.

Um diese Probleme zu beheben, verfügt Microsoft über einen Assembly Binding Log Viewer, der Ihnen zeigt, was zur Laufzeit vor sich geht


Ich denke, Sie haben ein wenig von dieser URL verpasst - die ASPX wurde in den Linktext eingefügt. Ich habe es aber geschafft, es zu finden.
Brian Stewart

oh ... ja, das Markdown-Steuerelement frisst Klammern in URLs, und leider setzt MSDN (VS80) in alle URLs :-(
Orion Edwards

44
Beachten Sie, dass .NET Reflector ab Anfang 2011 nicht mehr kostenlos ist. Das Open Source ILSpy-Projekt ist sehr ähnlich.
Yooy

1
Die Assembly Binding Log View v4.0.30319.1 ist völlig unbrauchbar. Protokolleinträge werden nicht in chronologischer Reihenfolge angezeigt und können nicht sortiert werden. Es werden Pfade angezeigt, die nicht in den Viewer passen, und Sie können die Größe nicht ändern. Es ist reine Zeitverschwendung.
Neutrino

dependencywalker.com Sie sollten URLs von Dingen angeben, die Sie erwähnen, insb. wenn sie funktionieren.
Toddmo

54

Ich finde das kleine Dienstprogramm AsmSpy ein unschätzbares Werkzeug zur Lösung von Problemen beim Laden von Assemblys. Es werden alle Baugruppenreferenzen verwalteter Baugruppen einschließlich Baugruppenversionen aufgelistet.

Führen Sie es an einer Eingabeaufforderung im Verzeichnis von .dllmit den folgenden Argumenten aus:

asmspy . all

asmspy Ausgabe Screenshot

Installieren Sie es schnell mit Chocolatey:

choco install asmspy

Kann es auch mit C # -Dateien oder Razor-Ansichten funktionieren? Ich erstelle ein Unterprojekt, indem ich einige Ansichten und einen Controller zur Laufzeit aus einem MVC-Projekt exportiere. Und ich möchte wissen, welche Abhängigkeiten von diesen Ansichten und dem Controller benötigt werden, damit ich diese Abhängigkeiten auch zur Laufzeit kopieren kann, um das Teilprojekt als separates Webprojekt auf IIS veröffentlichbar zu machen.
Rupendra

25

Öffnen Sie die Assembly-Datei in ILDASM und sehen Sie sich die .assembly extern im MANIFEST an


1
Kann ich die Version der abhängigen Assemblys auch so sehen? Ich sehe nur den Abhängigkeitsnamen, nicht auch die Version.
Michael R

Ja, ich kann die Version der abhängigen Baugruppen auch so sehen, wenn ich auf "MANIFES T" klicke
Michael R

1
Ich bevorzuge dieses - Sie müssen keine zusätzlichen Dienstprogramme herunterladen, wenn Sie in einer Entwicklungsumgebung arbeiten
Dan Field

Wie kann beim Debuggen eines App-Absturzes eines Drittanbieters nur ildasm auf dem Kunden von installiert werden?
Realtebo

18

Zum Durchsuchen von .NET-Code-Abhängigkeiten können Sie die Funktionen des Tools NDepend verwenden. Das Tool schlägt vor:

Eine solche Abfrage kann beispielsweise folgendermaßen aussehen:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

Das Ergebnis sieht folgendermaßen aus: (Beachten Sie die Tiefe der Codemetrik , 1 für direkte Anrufer, 2 für Anrufer von direkten Anrufern ...) (Beachten Sie auch die Schaltfläche In Diagramm exportieren, um das Abfrageergebnis in ein Anrufdiagramm zu exportieren. )

NDepend-Abhängigkeiten beim Durchsuchen der C # LINQ-Abfrage

Das Abhängigkeitsdiagramm sieht folgendermaßen aus:

NDepend-Abhängigkeitsdiagramm

Die Abhängigkeitsmatrix sieht folgendermaßen aus:

NDepend-Abhängigkeitsmatrix

Die Abhängigkeitsmatrix ist de facto weniger intuitiv als das Diagramm, eignet sich jedoch besser zum Durchsuchen komplexer Codeabschnitte wie:

NDepend Matrix vs Graph

Haftungsausschluss: Ich arbeite für NDepend


2
Patrick hätte wahrscheinlich erwähnen sollen, dass er der Autor dieses fantastischen Tools ist;). Ein Besuch lohnt sich wirklich. +1 für das Schreiben!
Mitch Wheat

1
Hey, das habe ich gerade selbst bemerkt. Ich lese gerne seine Blog-Beiträge - ich muss NDepend ausprobieren!
Brian Stewart

2
@MitchWheat - Name checkt aus haha, "Patrick vom NDepend-Team"
kayleeFrye_onDeck

Kann ich mit VStudio verwenden? Zum Debuggen von App-Abstürzen von Apps von Drittanbietern auf nicht meinem PC
Realtebo

16

Sie müssen keine Shareware-Apps oder -Tools herunterladen und installieren. Sie können dies programmgesteuert von .NET aus mitAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
Für Debugging-Zwecke ist dies bequemer über PowerShell : [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Hat den schönen Vorteil, dass keine dunklen Windows-Speicherorte für Tools heruntergeladen oder gesucht werden. +1
jpmc26

3
Korrigieren Sie mich, wenn ich falsch liege, aber dies gibt Ihnen nur den gleichen Fehler, den Ihre Anwendung mit einer fehlenden Abhängigkeit gibt, ist also nicht sehr nützlich
jk.

Dies funktioniert nur, wenn die Assembly in eine AppDomain geladen wird. Für Reflection geladene Baugruppen geben eine Nullmenge zurück.
David A. Gray

7

Wenn Sie die Mono-Toolchain verwenden, können Sie das monodisDienstprogramm mit dem --assemblyrefArgument verwenden, um die Abhängigkeiten einer .NET-Assembly aufzulisten. Dies funktioniert sowohl für .exeals auch für .dllDateien.

Anwendungsbeispiel:

monodis --assemblyref somefile.exe

Beispielausgabe (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Beispielausgabe (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

5

Aktivieren Sie die Protokollierung der Assemblybindung. Setzen Sie den Registrierungswert EnableLog in HKLM \ Software \ Microsoft \ Fusion auf 1. Beachten Sie, dass Sie Ihre Anwendung neu starten müssen (verwenden Sie iisreset), damit die Änderungen wirksam werden.

Tipp: Denken Sie daran, die Fusionsprotokollierung zu deaktivieren, wenn Sie fertig sind, da das Einschalten eine Leistungsbeeinträchtigung zur Folge hat.


5

Es ist lustig, dass ich ein ähnliches Problem hatte und nichts Passendes fand und mir des guten alten Dependency Walker bewusst war, also habe ich am Ende selbst eines geschrieben.

Dies befasst sich speziell mit .NET und zeigt rekursiv, welche Referenzen eine Assembly hat (und welche fehlen). Es werden auch native Bibliotheksabhängigkeiten angezeigt.

Es ist kostenlos (für den persönlichen Gebrauch) und hier für alle Interessierten verfügbar: www.netdepends.com

www.netdepends.com

Feedback willkommen.


Bitte fügen Sie Drag & Drop-Unterstützung zum Öffnen von Baugruppen hinzu. Es wäre auch schön, wenn die XCOPY-Bereitstellung sowie der Quellcode verfügbar wären.
Gigaplex

Mir ist gerade aufgefallen, dass die Website keine offensichtlichen Links zu dem Abschnitt enthält, in dem es zwei Ausgaben gibt, und die kostenlose ist für den nichtkommerziellen Gebrauch bestimmt. Ich bin versehentlich darauf gestoßen, als ich im Menü Hilfe die Option "Upgrade auf Professional" gefunden habe. Auf der Download-Seite sollte ein Hinweis erscheinen, dass es für die kommerzielle Nutzung nicht kostenlos ist.
Gigaplex

@gigaplex Ich werde diese beiden Dankeschöns zur Kenntnis nehmen, ich werde sehen, was ich tun kann.
Lloyd

1
Klicken Sie bei gedrückter Umschalttaste, um einen Baum und alle Unterelemente zu öffnen.
TS

1
Wie kann ich darüber informiert werden, welche Abhängigkeiten fehlen?
Realtebo

2

http://www.amberfish.net/

ChkAsm zeigt Ihnen alle Abhängigkeiten einer bestimmten Assembly auf einmal an, einschließlich der Versionen, und ermöglicht Ihnen die einfache Suche nach Assemblys in der Liste. Funktioniert für diesen Zweck viel besser als ILSpy ( http://ilspy.net/ ), das ich für diese Aufgabe verwendet habe.


1
Ab 2019 scheint diese Seite eine Art skizzenhaft aussehender Blog zu sein ...
McGuireV10

@ McGuireV10 So ist es. Das ist bedauerlich. Und ein schnelles Google zeigt keine Treffer mehr für diese App.
Mhenry1384

0

Ein weiteres praktisches Reflector-Add-In, das ich verwende, ist die Abhängigkeitsstrukturmatrix . Es ist wirklich toll zu sehen, welche Klassen was verwenden. Außerdem ist es kostenlos.


Zeigt leider keine Versionsnummern an, zumindest die Version, die als Visual Studio-Add-In installiert wird, nicht.
Mhenry1384

0

Versuchen Sie, Ihre .NET-Assembly mit der Option zu kompilieren --staticlink:"Namespace.Assembly" . Dies zwingt den Compiler, beim Kompilieren alle Abhängigkeiten einzuziehen. Wenn eine Abhängigkeit auftritt, auf die nicht verwiesen wird, wird normalerweise eine Warn- oder Fehlermeldung mit dem Namen dieser Assembly ausgegeben.

Namespace.Assemblyist die Assembly, von der Sie vermuten, dass sie das Abhängigkeitsproblem hat. In der Regel wird diese Assembly nur statisch verknüpft, um alle Abhängigkeiten transitiv zu referenzieren.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.