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?

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


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

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


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


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()

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

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.


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.


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.


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.


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.