Frage

Wie bestimme ich die Abhängigkeiten einer .NET-Anwendung?Tut Abhängigkeit Walker mit verwalteten Apps arbeiten?Ich habe die neueste Version heruntergeladen und versucht, ein Profil für die App zu erstellen, aber sie wird einfach ohne große Erklärung beendet.Wenn es mit .NET nicht funktioniert, gibt es dann ein anderes Tool, das mir beim Debuggen eines Problems beim Laden von Laufzeit-DLLs helfen könnte?

War es hilfreich?

Lösung

Dependency Walker funktioniert mit normalen Win32-Binärdateien.Alle .NET-DLLs und -Exe-Dateien haben einen kleinen Stub-Header-Teil, der sie wie normale Binärdateien aussehen lässt, aber im Grunde sagt es nur „Laden Sie die CLR“ – das ist also alles, was Ihnen der Dependency Walker sagen wird.

Um zu sehen, auf welche Dinge Ihre .NET-App tatsächlich angewiesen ist, können Sie die äußerst ausgezeichnete Funktion verwenden .NET-Reflektor vom Roten Tor.(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“ – dann sehen Sie ein „Abhängig von“-Element, das Ihnen alle anderen DLLs (und Methoden innerhalb dieser DLLs) anzeigt, die es benötigt.

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

Um solche Probleme zu beheben, bietet Microsoft eine Viewer für Assembly-Bindungsprotokolle die Ihnen zeigen kann, was los ist zur Laufzeit

Andere Tipps

Ich finde das kleine Dienstprogramm ASMSPY Ein unschätzbares Instrument zur Lösung von Problemen mit Ladungsbaugruppen. Es listet alle Montagereferenzen von verwalteten Baugruppen einschließlich Montageversionen auf.

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

asmspy . all

asmspy output screenshot

Installieren Sie es schnell mit schokoladigem:

choco install asmspy

Öffnen Sie die Montagedatei in Iildasm und schauen Sie in der Ossembly -Extern im Manifest

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

Zum Beispiel kann eine solche Abfrage aussehen wie:

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 sein Ergebnis sieht aus wie: (Beachten Sie die Code -Metrik Tiefe, 1 ist für direkte Anrufer, 2 für Anrufer von direkten Anrufern ...) (Beachten Sie auch den Exportieren der Schaltfläche Export in die Grafik, um das Abfrageergebnis in a zu exportieren Rufen Sie Diagramm an)

NDepend dependencies browsing through C# LINQ query

Die Abhängigkeitsgrafik sieht aus:

NDepend Dependency Graph

Die Abhängigkeitsmatrix sieht aus wie:

NDepend Dependency Matrix

Die Abhängigkeitsmatrix ist de facto Weniger intuitiv als das Diagramm, aber es ist besser geeignet, komplexe Codeabschnitte zu durchsuchen:

NDepend Matrix vs Graph

Haftungsausschluss: Ich arbeite für ndepend

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

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

Wenn Sie die Mono -Toolchain verwenden, können Sie verwenden das monodis Dienstprogramm mit dem --assemblyref Argument zur Auflistung der Abhängigkeiten einer .NET -Baugruppe. Dies wird an beiden funktionieren .exe und .dll Dateien.

Beispiel Verwendung:

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

Wenn Sie die Assembly-Bindungsprotokollierung aktivieren, legen Sie den Registrierungswert „EnableLog“ in HKLM\Software\Microsoft\Fusion auf 1 fest.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 die Aktivierung zu Leistungseinbußen führt.

Es ist lustig, dass ich ein ähnliches Problem hatte und nichts geeignetes fand und mir des guten alten Abhängigkeits Walker bewusst war, also schrieb ich am Ende selbst eine.

Dies befasst sich speziell mit .NET und zeigt an, welche Referenzen eine Montage rekursiv aufweist (und fehlt). Es wird auch native Bibliotheksabhängigkeiten angezeigt.

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

www.netdepends.com

Feedback Willkommen.

http://www.amberfish.net/

Chkasm zeigt Ihnen alle Abhängigkeiten einer bestimmten Baugruppe gleichzeitig, einschließlich der Versionen, und können Sie leicht nach Baugruppen in der Liste suchen. Funktioniert für diesen Zweck viel besser als Ilspy (http://ilspy.net/), was ich früher für diese Aufgabe verwendet habe.

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

Versuchen Sie, Ihre .NET -Baugruppe mit der Option zu kompilieren --staticlink:"Namespace.Assembly" . Dies zwingt den Compiler, alle Abhängigkeiten zur Kompilierungszeit einzuziehen. Wenn es auf eine Abhängigkeit stößt, auf die nicht verwiesen wird, wird eine Warn- oder Fehlermeldung normalerweise mit dem Namen dieser Baugruppe angezeigt.

Namespace.Assembly Ist die Versammlung, die Sie vermuten, als Abhängigkeitsproblem. In der Regel verweist die Verknüpfung dieser Baugruppe auf alle Abhängigkeiten transitiv.

Beste App, die ich sehe und benutze, zeigen Sie verpasste/problematische DLLs:http://www.dependencywalker.com/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top