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…:
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:
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ę:
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.
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?
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.
Bardzo dobrym programem jest jeszcze “Dependency walker”, mozna mu wrzucic jakikolwiek plik (exe, dll, …) i on pokaze wszystkie zaleznosci.
http://www.dependencywalker.com/
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.
Ja w takich wypadkach najczęściej używałem Assembly Binding Log Viewera (http://stackoverflow.com/questions/17681432/how-can-i-enable-assembly-binding-logging). Ale widzę że Twoje podejście może być znacznie lepsze (nie trzeba on/off logowania), z pewnością następnym razem spróbouje użyć procmon’a. Thx