Jak określić zależności aplikacji .NET?

107

Jak określić zależności aplikacji .NET? Czy Dependency Walker działa z aplikacjami zarządzanymi? Pobrałem najnowszą wersję i próbowałem profilować aplikację, ale po prostu wychodzi bez większego wyjaśnienia. Jeśli nie działa z .NET, to czy jest jakieś inne narzędzie, które pomogłoby mi w debugowaniu problemu z ładowaniem biblioteki DLL czasu wykonywania?

Brian Stewart
źródło

Odpowiedzi:

94

Dependency Walker działa na normalnych plikach binarnych win32. Wszystkie biblioteki DLL i pliki exe .NET mają niewielką część nagłówkową, która sprawia, że ​​wyglądają jak zwykłe pliki binarne, ale w zasadzie mówi tylko o „załadowaniu CLR” - więc to wszystko, co powie Ci walker zależności.

Aby zobaczyć, na czym polega Twoja aplikacja .NET, możesz skorzystać z niesamowicie doskonałego reflektora .NET firmy Red Gate. (EDYCJA: Zwróć uwagę, że .NET Reflector jest teraz produktem płatnym. ILSpy jest darmowy, open source i bardzo podobny).

Załaduj do niego bibliotekę DLL, kliknij prawym przyciskiem myszy i wybierz opcję „Analiza” - zobaczysz wtedy element „Zależy od”, który pokaże wszystkie inne biblioteki DLL (i metody wewnątrz tych bibliotek), których potrzebuje.

Czasami może to być trudniejsze, ponieważ Twoja aplikacja zależy od X dll, a X dll jest obecny, ale z jakiegokolwiek powodu nie można go załadować ani zlokalizować w czasie wykonywania.

Aby rozwiązać tego rodzaju problemy, firma Microsoft ma przeglądarkę dziennika powiązań zestawu, która może pokazać, co się dzieje w czasie wykonywania

Orion Edwards
źródło
Myślę, że trochę przegapiłeś ten adres URL - plik .aspx został umieszczony w tekście łącza. Ale udało mi się go znaleźć.
Brian Stewart
och ... tak, kontrola przeceny zjada nawiasy w adresach URL i niestety MSDN umieszcza (VS80) we wszystkich swoich adresach URL :-(
Orion Edwards
44
Należy pamiętać, że od początku 2011 r. .NET Reflector nie jest już darmowy. Projekt ILSpy open source jest bardzo podobny.
jojo,
1
Widok dziennika powiązań zestawów w wersji 4.0.30319.1 jest całkowicie bezużyteczny. Wpisy dziennika nie są wyświetlane w porządku chronologicznym i nie można ich sortować. Wyświetla ścieżki, które nie mieszczą się w przeglądarce i nie można zmienić jej rozmiaru. To kompletna strata czasu.
Neutrino
dependencywalker.com Powinieneś dołączyć adresy URL rzeczy, o których wspominasz, zwł. jeśli działają.
toddmo
54

Uważam, że małe narzędzie AsmSpy jest nieocenionym narzędziem do rozwiązywania problemów z ładowaniem zestawów. Zawiera listę wszystkich odniesień do zestawów zarządzanych, w tym wersji zestawów.

Uruchom go w wierszu polecenia w katalogu .dllz następującymi argumentami:

asmspy . all

zrzut ekranu wyjścia asmspy

Zainstaluj go szybko z Chocolatey:

choco install asmspy
Alexander van Trijffel
źródło
Czy może również działać na plikach C # lub widokach Razor? Tworzę podprojekt, eksportując niektóre widoki i kontroler z projektu MVC w czasie wykonywania. Chcę wiedzieć, jakie zależności są wymagane przez te widoki i kontroler, aby móc skopiować te zależności również w czasie wykonywania, aby umożliwić opublikowanie projektu podrzędnego jako osobnego projektu internetowego w usługach IIS.
Rupendra
25

Otwórz plik zespołu w ILDASM i zobacz @ .assembly extern w MANIFESTIE

Jim
źródło
1
Czy w ten sposób również mogę zobaczyć wersję zestawów zależnych? Widzę tylko nazwę zależności, a nie jej wersję.
Michael R
Właściwie tak, widzę również wersję zespołów zależnych w ten sposób, po kliknięciu „MANIFES T”
Michael R
1
Wolę ten - nie muszę pobierać żadnych dodatkowych narzędzi, jeśli pracujesz w środowisku deweloperskim
Dan Field,
Podczas debugowania awarii aplikacji innej firmy, jak zainstalować tylko ildasm na kliencie?
realtebo
18

Aby przeglądać zależności kodu .NET, można skorzystać z możliwości narzędzia NDepend. Narzędzie proponuje:

Na przykład takie zapytanie może wyglądać następująco:

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 }

A jego wynik wygląda następująco: (zwróć uwagę na głębokość metryki kodu , 1 jest dla bezpośrednich dzwoniących, 2 dla dzwoniących bezpośrednich ...) (zwróć także uwagę na przycisk Eksportuj do wykresu, aby wyeksportować wynik zapytania do wykresu połączenia )

Zależności NDepend przeglądanie zapytania C # LINQ

Wykres zależności wygląda następująco:

Wykres zależności NDepend

Macierz zależności wygląda następująco:

Macierz zależności NDepend

Macierz zależności jest de facto mniej intuicyjna niż wykres, ale jest bardziej odpowiednia do przeglądania złożonych sekcji kodu, takich jak:

Macierz NDepend vs Wykres

Zastrzeżenie: pracuję dla NDepend

Patrick z zespołu NDepend
źródło
2
Patrick powinien był chyba wspomnieć, że jest autorem tego fantastycznego narzędzia;). Naprawdę warto to sprawdzić. +1 za napisanie tego!
Mitch Wheat
1
Hej, właśnie to zauważyłem. Lubię czytać jego posty na blogu - będę musiał wypróbować NDepend!
Brian Stewart,
2
@MitchWheat - nazwa się sprawdza haha, „Patrick from NDepend team”
kayleeFrye_onDeck
Czy mogę używać z VStudio? Aby debugować awarie aplikacji innych firm na moim komputerze
realtebo
16

Nie musisz pobierać ani instalować aplikacji ani narzędzi typu shareware. Możesz to zrobić programowo z .NET używającAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()
Colonel Panic
źródło
9
Dla celów debugowania, jest to bardziej wygodne, aby to zrobić za pomocą PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Ma tę zaletę, że nie pobiera ani nie szuka narzędzi w niejasnych lokalizacjach systemu Windows. +1
jpmc26
3
popraw mnie, jeśli się mylę, ale to po prostu da ci ten sam błąd, który daje twoja aplikacja z brakującą zależnością, więc nie jest zbyt przydatny
jk.
Działa to tylko wtedy, gdy zestaw jest ładowany do AppDomain. Zestawy załadowane do odbicia zwracają zestaw zerowy.
David A. Gray
7

Jeśli używasz toolchain Mono, można skorzystać z monodisnarzędzia z --assemblyrefargumentem do listy zależności o .NET montaż. Będzie to działać zarówno na plikach, jak .exei .dll.

Przykładowe użycie:

monodis --assemblyref somefile.exe

Przykładowe dane wyjściowe (.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

Przykładowe dane wyjściowe (.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
Alexander O'Mara
źródło
5

Włącz rejestrowanie powiązań zespołu ustaw wartość rejestru EnableLog w HKLM \ Software \ Microsoft \ Fusion na 1. Należy zauważyć, że należy ponownie uruchomić aplikację (użyć iisreset), aby zmiany odniosły skutek.

Wskazówka: pamiętaj, aby wyłączyć rejestrowanie fuzji po zakończeniu, ponieważ włączenie go wiąże się z obniżeniem wydajności.

Ramesh
źródło
5

To zabawne, że miałem podobny problem i nie znalazłem nic odpowiedniego i byłem świadomy starego dobrego Dependency Walkera, więc ostatecznie napisałem jeden sam.

Dotyczy to w szczególności .NET i pokaże rekursywnie, jakie odwołania ma zestaw (i jakich brakuje). Pokaże również zależności bibliotek natywnych.

Jest bezpłatny (do użytku osobistego) i dostępny tutaj dla wszystkich zainteresowanych: www.netdepends.com

www.netdepends.com

Opinie mile widziane.

Lloyd
źródło
Dodaj obsługę przeciągania i upuszczania przy otwieraniu zespołów. Byłoby również miło, gdyby dostępne było wdrożenie XCOPY, a także kod źródłowy.
gigaplex
Właśnie zauważyłem, że strona nie ma żadnych oczywistych linków do sekcji, w której są dwie edycje, a bezpłatna jest przeznaczona do użytku niekomercyjnego. Przypadkowo natknąłem się na to, znajdując opcję „Uaktualnij do wersji Professional” w menu Pomoc. Na stronie pobierania powinna znajdować się informacja, że ​​nie jest ona bezpłatna do użytku komercyjnego.
gigaplex
@gigaplex Zwrócę uwagę na oba te podziękowania, zobaczę, co da się zrobić.
Lloyd,
1
Shiftclick, aby otworzyć drzewo, a wszystkie elementy podrzędne również byłyby przydatne.
TS,
1
W jaki sposób poinformuj mnie o brakujących zależnościach?
realtebo
2

http://www.amberfish.net/

ChkAsm pokaże wszystkie zależności określonego zestawu naraz, w tym wersje, i łatwo umożliwi wyszukiwanie zestawów na liście. Działa znacznie lepiej w tym celu niż ILSpy ( http://ilspy.net/ ), którego używałem do tego zadania.

mhenry1384
źródło
1
Od 2019 roku ta strona wydaje się być szkicowym blogiem ...
McGuireV10
@ McGuireV10 Tak to jest. To niefortunne. I szybkie Google nie wyświetla już żadnych trafień dla tej aplikacji.
mhenry1384
0

Innym przydatnym dodatkiem Reflector, którego używam, jest Matryca Struktury Zależności . Wspaniale jest zobaczyć, jakie zajęcia wykorzystują czego. Dodatkowo to nic nie kosztuje.

Richard Morgan
źródło
Niestety nie pokazuje numerów wersji, przynajmniej wersja instalowana jako dodatek do programu Visual Studio nie.
mhenry1384
0

Spróbuj skompilować zestaw .NET z opcją --staticlink:"Namespace.Assembly" . Zmusza to kompilator do ściągnięcia wszystkich zależności w czasie kompilacji. Jeśli napotka zależność, do której nie ma odwołania, wyświetli ostrzeżenie lub komunikat o błędzie, zwykle z nazwą tego zestawu.

Namespace.Assemblyjest zestawem, który podejrzewasz, że ma problem z zależnościami. Zwykle tylko statyczne łączenie tego zestawu będzie odwoływać się do wszystkich zależności przechodnie.


źródło
-4

Najlepsza aplikacja, którą widzę i której używam, pokazuje pominięte / problematyczne pliki DLL: http://www.dependencywalker.com/

user1005462
źródło
2
To narzędzie nie pomoże w przypadku zestawów .NET.
Kevin Panko