DLL bağımlılığı nasıl kontrol edilir?


167

Bazen küçük bir proje yaparken yeterince dikkatli değilim ve yanlışlıkla bilmediğim bir DLL'ye bağımlılık ekliyorum. Bu programı bir arkadaşınıza veya başka bir kişiye gönderdiğimde, "bazı DLL" eksik olduğu için "çalışmıyor". Bu tabii ki program DLL sistemimde bulabilirsiniz, ama onlarınkinde değil.

DLL bağımlılıkları için yürütülebilir bir tarama veya bu aykırı durumları önlemek için test etmek için "temiz" DLL içermeyen bir ortamda programı yürütmek için bir yolu var mı ?


2
Hata ayıklayıcı, Çıktı penceresinde yüklenen her DLL dosyasını gösterir. Debug + Windows + Modülleri bunların bir listesini gösterir. Hepsini hesaba katabildiğinizden emin olun. Yükleyicinizi kodunuzu test ettiğiniz gibi test edin, bir VM kullanın.
Hans Passant

@Hans Passant: Standart Windows DLL dosyalarının tam listesini bir yerde bulabilir miyim?
orlp

Evet, c: \ windows \ system32 içinde bir Microsoft telif hakkı ile.
Hans Passant

2
@orlp - Ayrıca deneyebilirsiniz dumpbin /dependents <program>. Liste %SYSTEM%veya tüm DLL listelemekten daha alakalı olacağını tahmin ediyorum %SYSTEM32%. Ayrıca MSDN'deki DUMPBIN Seçenekleri'ne bakın .
jww

Yanıtlar:


106

Deneyin Dependency Walker(2006'da son güncelleme) veya modern bir yeniden yazma denir Dependencies.


20
Ben şimdi tarihli olduğunu okudum, daha güncel bir şey var mı?
TankorSmash

6
Mümkünse, ddl bağımlılığı işletim sistemi işi olması gerektiğinden yalnızca orijinal işletim sistemi sağlayıcısına güveneceğim. Herhangi bir Microsoft yardımcı programı bunu yapabilir mi? Komut satırı benim için iyi.
Robin Hsu19

3
@RobinHsu: DependencyWalker En son inşa birlikte gelen Visual Studio 2005 yılına kadar, Visual Studio ile gemi kullanılan Windows sürücünün Geliştirme Kiti (ve resmi web sitesi aracılığıyla mevcut değildir). Hala resmi olarak bir Microsoft aracı değil, ancak Microsoft tarafından onaylandı, tanıtıldı ve reklam verildi.
16'da


8
C # 'da kısmen yapılmış bir açık kaynak yeniden yazma var, " Dependencies.exe " ile tanışın : github.com/lucasg/Dependencies . Test izlenimi: biraz beta-ish , ancak API setlerini ve SxS'yi görünüşte ele alıyor (Dependency Walker'da eksik).
Stein Åsmul

219

dumpbin Visual Studio araçlarından (VC \ bin klasörü) burada yardımcı olabilir:

dumpbin /dependents your_dll_file.dll

7
Kullanışlı küçük bir araç ve zaten VS yüklü olduğunda yeni bir şey yüklemek zorunda kalmaz.
James

13
Evet, dumpbin.exeanlaması çok yararlı /dependentsve /imports. Birlikte kopyalarsanız link.exeve karşılık gelen x86 Visual C ++ Çalışma Zamanı Yeniden Dağıtılabilir'in ( msvcr120.dllVisual Studio 2013 için) hedef makinede kullanılabilir olduğundan emin olursanız, diğer makinelerde de kullanabilirsiniz . Bazı seçeneklerin ek bağımlılıkları vardır. - Bu arada, seçenek adını berbat ettiler, daha /PREREQUISITESziyade /DEPENDENTSLatince çalışmalıydılar.
Lumi

2
Bu harika bir şey, son yürütülebilir dosya oluşturulduğunda bir doğrulama adımı olarak bunu yapı sistemimize ekledik, bu nedenle gönderimde bulunmayan bir şeye bağlı değiliz.
Lothar

4
Tek dezavantajı bu kullanışlı araç çok gizli: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach Visual Studio komut satırını (Araçlar -> Visual Studio Komut İstemi) açarsanız, bu harici bir komut olarak tanınır ve yalnızca "dumpbin" yazmanız gerekir.
Bemipefe

46

Linux hayranları için ilginç bir çözüm önerebilirim. Bu çözümü keşfettikten sonra, DependencyWalker'dan buna geçtim.

Sık kullanılanlarınızı lddWindows ile ilgili exeolarak kullanabilirsiniz dll.

Bunu yapmak için Windows'unuza Cygwin'i (ek kurulum gerektirmeden temel kurulum) yüklemeniz ve daha sonra başlamanız gerekir Cygwin Terminal. Artık aşağıdakiler dahil en sevdiğiniz Linux komutlarını çalıştırabilirsiniz:

$ ldd your_dll_file.dll

UPD: Windows'ta git bash terminali üzerindenldd de kullanabilirsiniz . Git zaten yüklüyse cygwin yüklemenize gerek yoktur.


Sadece cygwin'i yükledim ve linux komutlarını bulmaktan mutlu oldum, ancak yerel sürücümdeki (C :) diğer dosyalara erişmek için Cygwin kökünden çıkamadım. Bu normal mi?
ThomasGuenet

1
Bunun size yardımcı olabileceğini düşünüyorum: stackoverflow.com/questions/1850920/…
troyane

4
Ne yazık ki, bu şekilde bulunmayan bazı bağımlılıklar vardır: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Dumpbin yardımcı programı tüm bağımlılıkları doğru bir şekilde gösterir.
fgiraldeau

5
Ben ldd üzerinden Windows üzerinde GIT BASH terminali kullanın ve iyi çalışıyor. Yani git varsa kolay olacak, cygwin yüklemeye gerek yok. Örnek: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov

1
Git bash'ı kurulu olan biri olarak, bu tercih edilen bir çözümdü. Teşekkür ederim!
Nicolas

28
  1. Üzerinde çalışmaya çalıştığınız montajın tam dosya yolunu bulun

  2. Başlat düğmesine basın, "dev" yazın. "VS 2017 için Geliştirici Komut İstemi" adlı programı başlatın

  3. Açılan pencereye, 1. adımda çözdüğünüz yolu dumpbin /dependents [path]nerede yazın[path]

  4. giriş tuşuna basın

Bam, bağımlılık bilgin var. Pencere şöyle görünmelidir:

resim açıklamasını buraya girin

VS 2019 Güncellemesi: VS kurulumunuzda bu pakete ihtiyacınız var:resim açıklamasını buraya girin


9
  1. "Bağımlı" adlı bir program var
  2. Yüklü cygwin varsa, ldd file.exe'den daha basit bir şey yok

4
Araca Bağımlılık Yürütücüsü denir ; çalıştırılabilir görüntüsü, depends.exe olarak adlandırılır .
öngörülemez

7
Bağımlılık Walker tarihli. Son inşa tarihi 2008'de!
SuB

dependsAPI setlerini desteklemediğinden Win7 + için işe yaramaz.
ivan_pozdeev

8

En güvenli şey, programınızı test edebileceğiniz temiz bir sanal makineye sahip olmaktır. Test etmek istediğiniz her sürümde, VM'yi ilk temiz değerine geri yükleyin. Ardından kurulumunu kullanarak programınızı kurun ve çalışıp çalışmadığına bakın.

DLL sorunları farklı yüzlere sahip. Visual Studio kullanıyorsanız ve dinamik olarak CRT'ye bağlanırsanız, CRT DLL'lerini dağıtmanız gerekir. VS'nizi güncelleyin ve CRT'nin başka bir sürümünü dağıtmanız gerekir. Bunları kaçırabileceğiniz için sadece bağımlılıkları kontrol etmek yeterli değildir. Temiz bir makineye tam kurulum yapmak tek güvenli çözümdür, IMO.

Tam gelişmiş bir test ortamı kurmak istemiyorsanız ve Windows 7 kullanıyorsanız, ilk temiz makine olarak XP-Mode'u ve VM'yi çoğaltmak için XP- More'u kullanabilirsiniz.


6

Geliştirme makinenizde programı yürütebilir ve Sysinternals Process Explorer'ı çalıştırabilirsiniz . Alt bölmede, yüklü DLL'leri ve bunlara yönelik geçerli yolları gösterir, bu da birkaç nedenden dolayı kullanışlıdır. Dağıtım paketinizi yürütüyorsanız, hangi DLL'lere yanlış yolda başvurulduğunu (yani doğru paketlenmemiş) ortaya çıkarır.

Şu anda, şirketimiz bağımlılık ağacında yürümek ve program gevşek dosyaları olarak çıktı için Visual Studio Installer projeleri kullanıyor. VS2013'te, bu artık bir uzantıdır: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Daha sonra bu gevşek dosyaları daha kapsamlı bir yükleyicide paketliyoruz, ancak en azından bu kurulum tüm nokta net bağımlılıklarını yansıtıyor ve bir noktaya bırakıyor ve bir şeyler eksik olduğunda sizi uyarıyor.


2

Geçmişte (yani WinXP günlerinde), DLL Bağımlılığı Yürütücüsüne (depends.exe) bağlı / güveniyordum ama hala DLL sorunlarını belirleyemediğim zamanlar var. İdeal olarak, çalışmadan önce denetimlerle öğrenmek isteriz, ancak bu sorunu çözmezse (veya çok fazla zaman alırsa), http://blogs.msdn.com/ adresinde açıklandığı gibi "yükleyici ekini" etkinleştirmeyi deneyebilirsiniz. b / junfeng / arşiv / 2006/11/20 / hata ayıklama-loadlibrary-failures.aspx ve https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx ve kısaca bahsedilen LoadLibrary başarısız olur; GetLastError yardım yok

UYARI: Geçmişte Windows'umu berbat ettim ve gflag ile dizlerinin üzerinde sürünmesini sağladım, önceden uyarıldınız.

resim açıklamasını buraya girin

Not: "Yükleyici eki" işlem başınadır, bu nedenle kullanıcı arayüzü etkinleştirmesi kontrol edilmez (cdb veya glfags -i kullanın)


2

NDepend, Jesse tarafından zaten belirtildi (.NET kodunu analiz ederseniz), ancak tam olarak nasıl yardımcı olabileceğini açıklayalım.

DLL bağımlılıkları için bir yürütülebilir tarama veya program bu aykırı durumları önlemek için test için "temiz" DLL içermeyen bir ortamda yürütmek bir program / komut dosyası var mı?

NDepend Proje Özellikleri panelinde, analiz edilecek uygulama derlemelerinin ne olduğunu (yeşil) tanımlayabilirsiniz ve NDepend, uygulama olanlar (mavi olarak) tarafından kullanılan Üçüncü Taraf derlemelerini çıkartacaktır . Uygulama ve üçüncü taraf derlemelerinin aranacağı dizinlerin listesi sağlanır.

NDepend Proje Özellikleri Uygulaması ve Üçüncü Taraf meclisleri

Bu dizinlerde üçüncü taraf bir derleme bulunamazsa, hata modunda olacaktır. Örneğin, .NET Fx dizinini kaldırırsam C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319.NET Fx üçüncü taraf derlemelerinin çözümlenmediğini görebilirim:

NDepend Project Properties Uygulaması ve Üçüncü Taraf derlemeler çözülmedi

Feragatname: NDepend için çalışıyorum


1

Lütfen Google'da "depends.exe" araması, bu küçük bir yardımcı program.


7
Bağımlılık yürüteç oldukça tarihli ve 64 bit ile iyi bir işbirliği olmadığını unutmayın. OP'nin aradığı tüm bağımlı DLL'leri kesinlikle gösterecektir, ancak aynı zamanda gürültü ekler - bazı 64 bit dll'leri ve benzeri eksik 32 bit yürütülebilir olduğunu göreceksiniz ... Ne yazık ki, hala daha iyi yok alternatif.
eran

@eran Şimdi ne olacak? Şimdi daha iyi bir alternatif var mı? Teşekkürler.
Nikos

@ RestlessC0bra Bildiğimden emin değilim, ancak son 5 yıldır Windows geliştirme yapmıyorum. Bağımlılık yürüteç kesin olarak öldü ve Microsoft'un bu yararlı aracı güncellemekten rahatsız olmadığı ya da kaynağını açtığı için başkalarının hayatta kalması utanç verici.
eran

1
@ eran Hayır DW ölmedi. Görünüşe göre hala yaygın olarak kullanılmaktadır. Başka araçlar da var, ancak DW hala en iyisi.
Nikos

@ RestlessC0bra: Bağımlılık Walker öldü. 64-bit modülleri asla yakalayamadı. Yeterince yakından bakarsanız, Dependency Walker'ın bu yaygın kullanımı, bir şeyin neden olduğunu soran Stack Overflow sorularına yol açar. Yine de bir şey asla olmaz. Bu sadece yanlış bir negatif / pozitif. Process Monitor tercih ettiğiniz araç olmalıdır.
Tahmin edilemez

1

Kaynak kodunuz varsa, ndepend kullanabilirsiniz.

http://www.ndepend.com/

Pahalıdır ve bağımlılıkları analiz etmekten çok daha fazlasını yapar, bu nedenle aradığınız şey için aşırı olabilir.


3
.NET için özel olarak uyarlanmış bir araç olan bu araç, yerel görüntüler için de bağımlılıkları analiz ediyor mu?
16'da

Muhtemelen hayır, öngörülebilir. Ben muhtemelen P-Invoke bir şey kullanmak dışında, .NET bunu yapmak için bir yol olduğunu sanmıyorum.
kayleeFrye_onDeck

@kayleeFrye_onDeck: İçe aktarma tablolarını ayrıştırma dosyaları okumakla sınırlıdır. .NET dosyaları okuyabilir.
IInspectable

Evet! Ve yine de, bunu yapmak için hiçbir .NET API yok :( Ne önerirsiniz? Ben gerçekten bir .NET programcısı değilim, sadece daha düşük seviye çözümler çıkmadığında kullanan biri. orada, ancak Windows için çok azı, hızlı bir şekilde, dağılmaya dost ... Derleme sırasında kullanılan çerçeveleri tespit etmek için bilinmeyen bir ikili dosyayı tekrar tekrar incelemek için kullanmak istiyordum, bu yüzden onlara özel params hoc. Ben içine bakmak bakmak olabilir LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck: Windows API'sinde modüllerin içe aktarma tablolarını okuyacak hiçbir şey yoktur. Dosyaları okumalı ve içeriği ayrıştırmalısınız. Yerel kod ve .NET arasında fark yok. LoadLibraryExorada yardımcı olmuyor.
Tahmin edilemez

0

Pedeps projesi ( https://github.com/brechtsanders/pedeps ), .exe (veya .dll) dosyalarınızı / dosyalarınızı bağımlı olduğu tüm dosyalarla birlikte kopyalamak için bir komut satırı aracına (copypedeps) sahiptir. Uygulamanın çalıştığı sistemde bunu yaparsanız, tüm bağımlılık DLL'leri ile gönderebilmeniz gerekir.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.