Czasami, gdy robię mały projekt, nie jestem wystarczająco ostrożny i przypadkowo dodaję zależność dla biblioteki DLL, której nie jestem świadomy. Kiedy wysyłam ten program do znajomego lub innej osoby, „nie działa”, ponieważ brakuje „jakiejś biblioteki DLL”. Dzieje się tak, ponieważ program może znaleźć bibliotekę DLL w moim systemie, ale nie w swoim.
Czy istnieje sposób na przeskanowanie pliku wykonywalnego pod kątem zależności DLL lub uruchomienie programu w „czystym” środowisku wolnym od DLL w celu przetestowania, aby zapobiec takim sytuacjom oops ?
windows
dll
dependencies
orlp
źródło
źródło
dumpbin /dependents <program>
. Domyślam się, że lista będzie bardziej odpowiednia niż lista wszystkich bibliotek DLL w%SYSTEM%
lub%SYSTEM32%
. Zobacz także opcje DUMPBIN w witrynie MSDN.Odpowiedzi:
Wypróbuj
Dependency Walker
(ostatnia aktualizacja w 2006 r.) Lub jego nowoczesne przepisanie o nazwieDependencies
.źródło
dumpbin
nad uzależnieniem. msdn.microsoft.com/en-us/library/756as972.aspx | stackoverflow.com/a/28304716/3543437dumpbin
z narzędzi programu Visual Studio (folder VC \ bin) mogą tu pomóc:źródło
dumpbin.exe
jest bardzo przydatne, aby dowiedzieć się/dependents
i/imports
. Możesz go również używać na innych maszynach, jeśli kopiujeszlink.exe
razem z nim i upewnij się, że odpowiedni pakiet redystrybucyjny środowiska uruchomieniowego Visual C ++ x86 (msvcr120.dll
dla programu Visual Studio 2013) jest dostępny na komputerze docelowym. Niektóre opcje mają dodatkowe zależności. - Nawiasem mówiąc, schrzanili nazwę opcji, powinna/PREREQUISITES
raczej być niż/DEPENDENTS
powinni byli uczyć się łaciny.Mogę polecić ciekawe rozwiązanie dla fanów Linuksa. Po zbadaniu tego rozwiązania przeszedłem z DependencyWalker na to.
Można użyć ulubionego
ldd
nad związane z systemem Windowsexe
,dll
.Aby to zrobić, musisz zainstalować Cygwin (podstawowa instalacja, bez dodatkowych pakietów wymaganych) w systemie Windows, a następnie po prostu zacząć
Cygwin Terminal
. Teraz możesz uruchamiać swoje ulubione polecenia systemu Linux, w tym:UPD: Możesz
ldd
również użyć terminala git bash w systemie Windows . Nie ma potrzeby instalowania cygwin w przypadku, gdy masz już zainstalowany git.źródło
$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)
. Narzędzie dumpbin pokazuje poprawnie wszystkie zależności.Ustal pełną ścieżkę do zestawu, z którym próbujesz pracować
Naciśnij przycisk Start, wpisz „dev”. Uruchom program o nazwie „Developer Command Prompt for VS 2017”
W oknie, które zostanie otwarte, wpisz
dumpbin /dependents [path]
, gdzie[path]
jest ścieżka, którą odkryłeś w kroku 1naciśnij klawisz Enter
Bam, masz informacje o swojej zależności. Okno powinno wyglądać następująco:
Aktualizacja dla VS 2019: ten pakiet jest potrzebny w instalacji VS:
źródło
źródło
depends
nie obsługuje zestawów API, więc jest bezużyteczny dla Win7 +.Najbezpieczniej jest mieć czystą maszynę wirtualną, na której możesz przetestować swój program. W każdej wersji, którą chcesz przetestować, przywróć maszynę wirtualną do jej początkowej czystej wartości. Następnie zainstaluj program, używając jego konfiguracji i sprawdź, czy działa.
Problemy DLL mają różne oblicza. Jeśli używasz programu Visual Studio i dynamicznie łączysz się z CRT, musisz rozpowszechniać biblioteki DLL CRT. Zaktualizuj swój VS, a będziesz musiał rozprowadzać inną wersję CRT. Samo sprawdzenie zależności nie wystarczy, ponieważ możesz je przegapić. Wykonanie pełnej instalacji na czystej maszynie jest jedynym bezpiecznym rozwiązaniem, IMO.
Jeśli nie chcesz konfigurować pełnego środowiska testowego i masz Windows 7, możesz użyć trybu XP jako początkowej czystej maszyny i XP-More, aby zduplikować maszynę wirtualną.
źródło
Na komputerze deweloperskim możesz uruchomić program i uruchomić Sysinternals Process Explorer . W dolnym okienku pokaże załadowane biblioteki DLL i bieżące ścieżki do nich, co jest przydatne z wielu powodów. Jeśli wykonujesz poza pakietem wdrożeniowym, ujawni się, do których bibliotek DLL odwołuje się niewłaściwa ścieżka (tj. Nie zostały prawidłowo zapakowane).
Obecnie nasza firma korzysta z projektów Instalatora Visual Studio, aby przejść po drzewie zależności i wyprowadzić jako luźne pliki programu. W VS2013 jest to teraz rozszerzenie: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Następnie pakujemy te luźne pliki w bardziej wszechstronny instalator, ale przynajmniej ten konfigurator projektuje wszystkie zależności dot net i umieszcza je w jednym miejscu i ostrzega, gdy czegoś brakuje.
źródło
W przeszłości (tj. Dni WinXP), polegałem / polegałem na DLL Dependency Walker (depend.exe), ale są chwile, kiedy nadal nie jestem w stanie określić problemu (ów) DLL. Najlepiej byłoby się tego dowiedzieć przed uruchomieniem poprzez inspekcje, ale jeśli to nie rozwiąże problemu (lub zajmie zbyt dużo czasu), możesz spróbować włączyć „przystawkę modułu ładującego”, jak opisano na http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx i https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx i krótko wspomniano, że LoadLibrary zawodzi; GetLastError bez pomocy
OSTRZEŻENIE: Zepsułem mój Windows w przeszłości wygłupiając się z gflag, który czołgał się na kolana, zostałeś ostrzeżony.
Uwaga: „Snap modułu ładującego” jest zależny od procesu, więc włączenie interfejsu użytkownika nie pozostanie sprawdzone (użyj cdb lub glfags -i)
źródło
Jesse wspomniał już o NDepend (jeśli analizujesz kod .NET), ale wyjaśnijmy dokładnie, jak może pomóc.
W panelu Właściwości projektu NDepend możesz zdefiniować, jakie zestawy aplikacji mają być analizowane (na zielono), a NDepend będzie wywnioskować zestawy innych firm używane przez zespoły aplikacji (na niebiesko). Podana jest lista katalogów, w których można wyszukiwać aplikacje i zestawy innych firm.
Jeśli zestaw innej firmy nie zostanie znaleziony w tych katalogach, będzie w trybie błędu. Na przykład, jeśli usunę katalog .NET Fx
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
, widzę, że zestawy innych firm .NET Fx nie są rozwiązane:Uwaga: pracuję dla NDepend
źródło
Wyszukaj w google „depends.exe”, jest to małe narzędzie do obsługi tego problemu.
źródło
Jeśli masz kod źródłowy, możesz użyć ndepend.
http://www.ndepend.com/
Jest drogi i robi o wiele więcej niż analizowanie zależności, więc może to być przesada w przypadku tego, czego szukasz.
źródło
LoadLibraryEx
...LoadLibraryEx
tam nie pomaga.Projekt Pedeps ( https://github.com/brechtsanders/pedeps ) ma narzędzie wiersza poleceń (copypedeps) do kopiowania plików .exe (lub .dll) wraz ze wszystkimi plikami, od których zależy. Jeśli zrobisz to w systemie, w którym działa aplikacja, powinieneś być w stanie dostarczyć ją ze wszystkimi zależnymi bibliotekami DLL.
źródło
Skorzystaj z zestawu narzędzi SysInternal firmy Microsoft, korzystając z poniższego łącza, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
Przejdź do folderu pobierania, otwórz „Procexp64.exe” jako uprawnienia administratora. Otwórz menu Znajdź-> "Znajdź uchwyt lub bibliotekę DLL" lub skrót Ctrl + F.
źródło
Wypróbuj JetBrains dotPeek . Jest wolne.
źródło