windows - Sådan kontrolleres DLL afhængighed?

Indlæg af Hanne Mølgaard Plasc

Problem



Nogle gange, når jeg laver et lille projekt, er jeg ikke forsigtig nok og tilfældigt tilføjer en afhængighed af en DLL, som jeg ikke er klar over. Når jeg sender dette program til en ven eller andre mennesker 'virker det ikke' fordi 'nogle DLL' mangler. Dette er selvfølgelig fordi programmet kan finde DLL'en på mit system, men ikke på deres.


Er der et program/script, der kan scanne en eksekverbar for DLL afhængigheder eller udføre programmet i et 'rent' DLL-frit miljø til test for at forhindre disse oops situationer?

Bedste reference


Prøv afhængighed walker: http://www.dependencywalker.com/[10]

Andre referencer 1


dumpbin fra Visual Studio-værktøjer (VC \ bin-mappe) kan hjælpe her:


dumpbin /dependents your\_dll\_file.dll

Andre referencer 2


Jeg kan anbefale interessant løsning til Linux fans. Efter at jeg har udforsket denne løsning, har jeg skiftet fra DependencyWalker til dette.


Du kan bruge din yndlings ldd over Windows-relaterede exe, dll. [11]


For at gøre dette skal du installere Cygwin (grundlæggende installation uden ekstra nødvendige pakker) på din Windows og start derefter bare Cygwin Terminal. Nu kan du køre dine foretrukne Linux-kommandoer, herunder: [12]


$ ldd your\_dll\_file.dll


UPD: Du kan også bruge ldd via git bash-terminalen på Windows. Ingen grund til at installere cygwin, hvis du allerede har installeret git. [13]

Andre referencer 3



  1. Der er et program kaldet 'Afhænger'

  2. Hvis du har cygwin installeret, er det ikke noget enklere end ldd file.exe


Andre referencer 4


Den sikreste ting er at have en ren virtuel maskine, som du kan teste dit program på. På hver version, du vil teste, skal du gendanne VM til den oprindelige renværdi. Installer derefter dit program ved hjælp af dets opsætning, og se om det virker.


Dll problemer har forskellige ansigter. Hvis du bruger Visual Studio og dynamisk linker til CRT, skal du distribuere CRT DLL'erne. Opdater din VS, og du skal distribuere en anden version af CRT. Bare at kontrollere afhængigheder er ikke nok, som du måske savner dem. At gøre en fuld installation på en ren maskine er den eneste sikre løsning, IMO.


Hvis du ikke vil opsætte et fuldt blæst testmiljø og har Windows 7, kan du bruge XP-Mode som den oprindelige rene maskine og XP-More til at duplikere VM. [14]

Andre referencer 5


På din udviklingsmaskine kan du udføre programmet og køre Sysinternals Process Explorer. I den nederste rude vil det vise dig de indlæste DLL'er og de aktuelle stier til dem, der er nyttige af en række årsager. Hvis du udfører din implementeringspakke, vil det afsløre hvilke DLL'er der henvises til i den forkerte vej (dvs. ikke pakket korrekt). [15]


I øjeblikket bruger vores firma Visual Studio Installer projekter til at gå afhængigheds træet og output som løs filer programmet. I VS2013 er dette nu en udvidelse: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d. Vi pakker derefter disse løse filer i et mere omfattende installationsprogram, men i det mindste opstiller alle dot net afhængigheder og dråber dem til det ene sted og advarer dig, når ting mangler. [16]

Andre referencer 6


I fortiden (det vil sige WinXP dage), plejede jeg at afhænge/stole på DLL Dependency Walker (depends.exe), men der er tidspunkter, hvor jeg stadig ikke kan bestemme DLL-problemet (erne). Ideelt set vil vi gerne finde ud af før kørselstid ved inspektioner, men hvis det ikke løser det (eller tager for meget tid), kan du prøve at aktivere 'loader snap' som beskrevet på http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx og https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx og kort nævnt LoadLibrary fejler; GetLastError ingen hjælp [17] [18]


ADVARSEL: Jeg har fortidet min Windows i fortiden narret rundt med gflag, der gør det til at krybe i knæ, du har været advaret.


Indtast billedbeskrivelse her


Bemærk: 'Loader snap' er per-proces, så UI-aktiveringen vil ikke blive kontrolleret (brug cdb eller glfags -i)

Andre referencer 7


Søg venligst 'depends.exe' i google, det er et lille værktøj til at håndtere dette.

Andre referencer 8


Hvis du har kildekoden, kan du bruge ndepend.


http://www.ndepend.com/[20]


Det er dyrt og gør meget mere end at analysere afhængigheder, så det kan være overkill for hvad du leder efter.

Andre referencer 9


NDepend blev allerede nævnt af Jesse (hvis du analyserer .NET kode), men lad os forklare præcis, hvordan det kan hjælpe.



  Er der et program/script, der kan scanne en eksekverbar til DLL
  afhængigheder eller udføre programmet i et 'rent' DLL-frit miljø
  til test for at forhindre disse uopsigt situationer?



I panelet NDepend Project Properties kan du definere, hvilke applikationssamlinger der skal analyseres (i grønt), og NDepend vil udlede Tredjepartssamlinger, der bruges af applikationsenheder (i blåt). En liste over mapper, hvor man kan søge ansøgning og tredjepartssammensætninger, findes.


NDepend Project Properties-applikation og tredjepartssamlinger [21]


Hvis der ikke findes en tredjepartssamling i disse mapper, vil den være i fejltilstand. Hvis jeg f.eks. Fjerner. NET Fx-mappen C:WINDOWSMicrosoft.NETFrameworkv4.0.30319, kan jeg se, at .NET Fx-tredjepartssammensætninger ikke er løst:


NDepend Project Properties-applikationer og tredjepartssamlinger ikke løst [22]


Ansvarsfraskrivelse: Jeg arbejder for NDepend