it-swarm.com.de

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

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, sie wird jedoch ohne viel Erklärung beendet. Wenn es nicht mit .NET funktioniert, gibt es ein anderes Tool, das mir beim Debuggen eines Laufzeitproblems DLL helfen könnte?

98
Brian Stewart

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

Um herauszufinden, auf was Ihre .NET-App wirklich angewiesen ist, können Sie den enorm ausgezeichneten .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, das Ihnen alle anderen DLLs (und Methoden innerhalb dieser DLLs) zeigt, die es benötigt.

Manchmal kann es jedoch etwas komplizierter werden, da Ihre App von X-DLL abhängt und X-DLL vorhanden ist, aber aus irgendeinem Grund nicht zur Laufzeit geladen oder lokalisiert werden kann.

Um diese Probleme zu beheben, verfügt Microsoft über einen Assembly Binding Log Viewer , der Ihnen zeigt, was gerade läuft zur Laufzeit

84
Orion Edwards

Ich finde das kleine Hilfsprogramm AsmSpy ein unschätzbares Werkzeug zum Lösen von Problemen beim Laden von Baugruppen. Es listet alle Assembly-Referenzen von verwalteten Assemblys einschließlich Assembly-Versionen auf.

Führen Sie es in einer Eingabeaufforderung im Verzeichnis von .dll mit den folgenden Argumenten aus:

asmspy . all

 asmspy output screenshot

Installieren Sie es schnell mit Chocolatey:

choco install asmspy

Öffnen Sie die Assembly-Datei in ILDASM, und suchen Sie in MANIFEST @ the .Assembly extern

25
Jim

Um .NET-Codeabhängigkeiten zu durchsuchen, können Sie die Funktionen des Tools NDepend verwenden. Das Tool schlägt vor:

Eine solche Abfrage kann beispielsweise so 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 }

Und das Ergebnis sieht folgendermaßen aus: (Beachten Sie die Codemetrik depth, 1 ist 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 Aufrufdiagramm )

NDepend dependencies browsing through C# LINQ query

Die Abhängigkeitsgrafik sieht folgendermaßen aus:

NDepend Dependency Graph

Die Abhängigkeitsmatrix sieht folgendermaßen aus:

NDepend Dependency Matrix

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

NDepend Matrix vs Graph

Disclaimer: Ich arbeite für NDepend

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

Assembly.LoadFile(@"app").GetReferencedAssemblies()
13
Colonel Panic

Wenn Sie die Mono-Toolchain verwenden, können Sie mit dem Dienstprogramm monodis mit dem Argument --assemblyref die Abhängigkeiten einer .NET-Assembly auflisten. Dies funktioniert sowohl für .exe- als auch für .dll-Dateien.

Verwendungsbeispiel:

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
7

Aktivieren Sie die Assembly-Bindungsprotokollierung, und setzen Sie den Registrierungswert EnableLog in HKLM\Software\Microsoft\Fusion auf 1. Beachten Sie, dass Sie die Anwendung neu starten müssen (iisreset verwenden), damit die Änderungen wirksam werden.

Tipp: Denken Sie daran, die Fusionsprotokollierung zu deaktivieren, wenn Sie fertig sind, da es Performance-Nachteile gibt, wenn die Funktion aktiviert wird.

5
Ramesh

Es ist komisch, dass ich ein ähnliches Problem hatte und nichts passendes gefunden hatte. Ich war mir des guten alten Abhängigkeitswanderers bewusst, also schrieb ich am Ende selbst einen.

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

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

 www.netdepends.com

Feedback erwünscht.

4
Lloyd

http://www.amberfish.net/

ChkAsm zeigt Ihnen alle Abhängigkeiten einer bestimmten Assembly auf einmal, einschließlich der Versionen, und ermöglicht es Ihnen, leicht nach Assemblys in der Liste zu suchen. Dies funktioniert viel besser als ILSpy ( http://ilspy.net)/ ), was ich für diese Aufgabe verwendet habe.

2
mhenry1384

Kompilieren Sie Ihre .NET-Assembly mit der Option --staticlink:"Namespace.Assembly". Dies zwingt den Compiler, alle Abhängigkeiten zur Kompilierzeit einzuholen. Wenn auf eine Abhängigkeit Bezug genommen wird, auf die nicht verwiesen wird, wird normalerweise eine Warnung oder eine Fehlermeldung mit dem Namen der Assembly angezeigt.

Namespace.Assembly ist die Assembly, von der Sie vermuten, dass sie ein Abhängigkeitsproblem hat. Normalerweise werden durch das statische Verknüpfen dieser Assembly alle Abhängigkeiten transitiv referenziert.

0
user2074102

Ein weiteres praktisches Reflektor-Add-In, das ich verwende, ist die Dependency Structure Matrix . Es ist wirklich toll zu sehen, welche Klassen was verwenden. Und es ist kostenlos.

0
Richard Morgan