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
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
.dll
z następującymi argumentami:Zainstaluj go szybko z Chocolatey:
źródło
Otwórz plik zespołu w ILDASM i zobacz @ .assembly extern w MANIFESTIE
źródło
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:
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 )
Wykres zależności wygląda następująco:
Macierz zależności wygląda następująco:
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:
Zastrzeżenie: pracuję dla NDepend
źródło
Nie musisz pobierać ani instalować aplikacji ani narzędzi typu shareware. Możesz to zrobić programowo z .NET używając
Assembly.GetReferencedAssemblies()
źródło
[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. +1Jeśli używasz toolchain Mono, można skorzystać z
monodis
narzędzia z--assemblyref
argumentem do listy zależności o .NET montaż. Będzie to działać zarówno na plikach, jak.exe
i.dll
.Przykładowe użycie:
Przykładowe dane wyjściowe (.exe):
Przykładowe dane wyjściowe (.dll):
źródło
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.
źródło
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
Opinie mile widziane.
źródło
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.
źródło
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.
źródło
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.Assembly
jest 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
Najlepsza aplikacja, którą widzę i której używam, pokazuje pominięte / problematyczne pliki DLL: http://www.dependencywalker.com/
źródło