Znajdowanie brakującej biblioteki

Szukanie lokalizacji danej biblioteki może być skomplikowane. W zależności od skonfigurowanego binding’u, inne foldery są przeszukiwanie. Wyjątek jaki dostaniemy w przypadku braku jednej z bibliotek jest następujący:

Could not load file or assembly 'nazwa' or one of its dependencies. 
The system cannot find the file specified.

Problem stanowi druga część – “or one of its dependencies’. Wyjątek nie zawsze powie nam, której biblioteki brakuje nam. Jeszcze większe problemy natrafimy, gdy użyjemy natywnej referencji.

Ostatnio miałem problemy z pewnym kodem i użyłem programu Process Monitor. Aplikacja może nie jest zbyt intuicyjna, ale pozwala w dość szybki sposób prześledzić wszystkie wiązania i brakujące biblioteki.

Domyślnie pokazuje wszystkie procesy, zatem po jej odpaleniu, ustawiłem filtr pokazujący wyłącznie program, który chcę przeanalizować (w tym przypadku ConsoleApplication6.exe). Z menu głównego wybieramy Filter->Filter…:

filter1

Ponadto ustawiłem dwa dodatkowe filtry. Jeden, wyświetla wyłącznie zdarzenia, które w rezultacie mają “NAME NOT FOUND”. Drugi filtr wyświetli wyłącznie wpisy, w których ścieżka kończy się na “dll”. Przykład:

filter1

Dzięki temu, łatwiej będzie nam przeanalizować wszystkie zdarzenia, które mają miejsce w danym procesie. Bez tego, ciężko byłoby wszystko zrozumieć.

Po uruchomieniu ConsoleApplication6, Process Monitor powie nam, których bibliotek nie udało załadować się:

filter1

W tym przypadku (nie trudno domyślić się, sztucznie stworzonym) brakuje ClassLibrary2. W prawdziwych systemach, zwykle mamy bardzo wiele zależności i nie jest wtedy już to takie proste do zgadnięcia bez Process Monitor.

5 thoughts on “Znajdowanie brakującej biblioteki”

  1. Komunikat to:

    Could not load file or assembly ‘nazwa’ or one of its dependencies

    Tak?

    I ‘nazwa’ w tym komunikacie nie jest wystarczająca, że trzeba zaprzęgać całą maszynę ProcessMonitora do pracy, żeby dopisać sobie w myślach końcówkę .DLL?

    Jak wyglądał oryginalny komunikat?

  2. Nazwa bedzie zawierala glowna biblioteka. Czyli jesli mamy A, ktory zalezy np. na natywnym B wtedy w komunikacie wyswietli wylacznie A, pomimo, ze tak naprawde brakuje B.

  3. A czy on tez pokaze dynamicznie zaladowane DLL + natywne biblioteki? Z tego co wiem, to tylko statyczna analiza managed dll w chodzi tutaj w gre.

Leave a Reply

Your email address will not be published.