Bir .NET uygulamasının bağımlılıklarını nasıl belirlerim?


107

Bir .NET uygulamasının bağımlılıklarını nasıl belirlerim? Does Bağımlılık Walker yönetilen uygulamalar ile çalışır? En son sürümünü indirdim ve uygulamanın profilini çıkarmayı denedim, ancak çok fazla açıklama yapmadan çıkıyor. NET ile çalışmazsa, bir çalışma zamanı DLL yükleme sorununu ayıklamama yardımcı olacak başka bir araç var mı?

Yanıtlar:


94

Bağımlılık yürüteç, normal win32 ikili dosyalarında çalışır. Tüm .NET dll'leri ve exe'lerin, normal ikili dosyalar gibi görünmelerini sağlayan küçük bir saplama başlık bölümü vardır, ancak temelde söylediği tek şey "CLR'yi yükle" - yani bağımlılık yürüten kişinin size söyleyeceği tek şey budur.

.NET uygulamanızın gerçekte hangi şeylere dayandığını görmek için, Red Gate'in son derece mükemmel .NET reflektörünü kullanabilirsiniz . (DÜZENLEME: .NET Reflector'ın artık ücretli bir ürün olduğunu unutmayın. ILSpy ücretsiz ve açık kaynaklıdır ve çok benzerdir.)

DLL dosyanızı içine yükleyin, sağ tıklayın ve 'Analiz Et'i seçin - daha sonra ihtiyaç duyduğu tüm diğer dll'leri (ve bu dll'lerin içindeki yöntemleri) gösterecek bir "Bağımlı" öğesini göreceksiniz.

Bazen uygulamanızın X dll'ye bağlı olması ve X dll'nin mevcut olması, ancak her ne sebeple olursa olsun çalışma zamanında yüklenememesi veya bulunamaması nedeniyle bazen daha karmaşık olabilir.

Bu tür sorunları gidermek için Microsoft , çalışma zamanında neler olup bittiğini size gösterebilecek bir Assembly Binding Log Viewer'a sahiptir.


Sanırım bu URL'nin birazını kaçırdınız - .aspx bağlantı metnine yerleştirildi. Yine de bulmayı başardım.
Brian Stewart

oh ... evet, markdown kontrolü URL’lerde köşeli parantezler yer ve maalesef MSDN (VS80) tüm url’lerini koyar :-(
Orion Edwards

44
2011'in başlarından itibaren .NET Reflector'ın artık ücretsiz olmadığını unutmayın. Açık kaynak ILSpy projesi çok benzer.
yoyo

1
Assembly Binding Log View v4.0.30319.1 tamamen kullanılamaz. Günlük girişleri kronolojik sırada gösterilmez ve bunları sıralayamazsınız. Görüntüleyiciye sığmayan yolları görüntüler ve yeniden boyutlandıramazsınız. Tam bir zaman kaybı.
Neutrino

dependencywalker.com Sen, başkasıyla Bahsettiğiniz şeylerin URL'ler içermelidir. eğer çalışırlarsa.
Toddmo

54

Küçük yardımcı program AsmSpy'ı , montajları yükleme ile ilgili sorunları çözmek için paha biçilmez bir araç buluyorum . Montaj sürümleri dahil, yönetilen montajların tüm montaj referanslarını listeler.

.dllAşağıdaki bağımsız değişkenlerle dizinindeki bir komut isteminde çalıştırın :

asmspy . all

asmspy çıktı ekran görüntüsü

Chocolatey ile hızlıca kurun:

choco install asmspy

C # dosyalarında veya Razor görünümlerinde de çalışabilir mi? Çalışma zamanında bir mvc projesinden bazı görünümleri ve bir denetleyiciyi dışa aktararak bir alt proje oluşturuyorum. Ve bu Görünümler ve denetleyici tarafından hangi bağımlılıkların gerekli olduğunu bilmek istiyorum, böylece alt projeyi IIS üzerinde ayrı bir web projesi olarak yayınlanabilir hale getirmek için bu bağımlılıkları çalışma zamanında da kopyalayabilirim.
Rupendra

25

Montaj dosyasını ILDASM'de açın ve MANIFEST'te @ .assembly extern'e bakın.


1
Bağımlı derlemelerin sürümünü bu şekilde de görebilir miyim? Sadece bağımlılık adını görüyorum, versiyonunu görmüyorum.
Michael R.

Aslında, evet, "MANIFES T" ye tıklayarak bağımlı derlemelerin versiyonunu da bu şekilde görebilirim
Michael R

1
Bunu tercih ederim - bir geliştirme ortamında çalışıyorsanız herhangi bir ek yardımcı program indirmenize gerek yok
Dan Field

Bir üçüncü taraf uygulama çökmesinde hata ayıklarken, yalnızca müşterisine ildasm nasıl yüklenir?
realtebo

18

.NET kod bağımlılıklarına göz atmak için NDepend aracının yeteneklerini kullanabilirsiniz. Araç şunları önerir:

Örneğin böyle bir sorgu şöyle görünebilir:

from m in Methods 
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)") 
where depth  >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }

Ve sonucu şöyle görünür: (kod ölçüsü derinliğine dikkat edin , 1 doğrudan arayanlar için, 2 doğrudan arayanlar için ...) (ayrıca sorgu sonucunu Arama Grafiğine aktarmak için Grafiğe Aktar düğmesine de dikkat edin )

C # LINQ sorgusu aracılığıyla göz atan NBağımlı bağımlılıklar

Bağımlılık grafiği şöyle görünür:

NBağımlılık Grafiği

Bağımlılık matrisi şöyle görünür:

NDepend Bağımlılık Matrisi

Bağımlılık matrisi fiilen grafikten daha az sezgiseldir, ancak aşağıdaki gibi karmaşık kod bölümlerine göz atmak için daha uygundur:

NDepend Matrix ve Graph

Sorumluluk reddi: NDepend için çalışıyorum


2
Patrick muhtemelen bu harika aracın yazarından bahsetmeliydi;). Gerçekten kontrol etmeye değer. Yazdığınız için +1!
Mitch Wheat

1
Hey, bunu ben de fark ettim. Blog gönderilerini okumaktan zevk alıyorum - NDepend'i denemem gerekecek!
Brian Stewart

2
@MitchWheat - isim haha, "NDepend ekibinden Patrick"
kayleeFrye_onDeck

VStudio ile kullanabilir miyim? Bilgisayarımda olmayan üçüncü taraf uygulamaların uygulama çökmelerinde hata ayıklamak için
realtebo

16

Yazılım uygulamaları veya araçları indirip yüklemenize gerek yoktur. Bunu .NET üzerinden programlı olarak yapabilirsiniz.Assembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
Hata ayıklama amacıyla, bu PowerShell ile bunu daha da kolaylaştırmak: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Araçlar için belirsiz Windows konumlarını indirmemenin veya avlamamanın güzel bir avantajına sahiptir. +1
jpmc26

3
yanlışsa beni düzeltin ama bu size bağımlılığı eksik olan uygulamanızın verdiği aynı hatayı verecektir, bu yüzden çok kullanışlı değildir
jk.

Bu yalnızca derleme bir AppDomain'e yüklendiğinde çalışır. Yansıma için yüklenen derlemeler bir boş küme döndürür.
David A. Gray

7

Eğer Mono toolchain kullanıyorsanız, kullanabileceğiniz programı ile montaj bir .NET bağımlılıkları listelemek için argüman. Bu da çalışır ve dosyalar.monodis--assemblyref.exe.dll

Örnek kullanım:

monodis --assemblyref somefile.exe

Örnek çıktı (.exe):

$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

Örnek çıktı (.dll):

$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
    Name=mscorlib
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
    Name=System.Core
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
    Name=System
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
    Name=System.Xml
    Flags=0x00000000
    Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89

5

Derleme bağlama günlüğünü etkinleştirin HKLM \ Software \ Microsoft \ Fusion içindeki EnableLog kayıt defteri değerini 1 olarak ayarlayın. Değişikliklerin etkili olması için uygulamanızı yeniden başlatmanız (iisreset kullanın) gerektiğini unutmayın.

İpucu: İşiniz bittiğinde füzyon günlük kaydını kapatmayı unutmayın, çünkü açmanız için bir performans cezası vardır.


5

Komik bir sorun yaşadım ve uygun bir şey bulamadım ve eski Bağımlılık Walker'ın farkındaydım, bu yüzden sonunda kendim bir tane yazdım.

Bu, özellikle .NET ile ilgilenir ve bir derlemenin hangi referanslara sahip olduğunu (ve eksik olduğunu) özyinelemeli olarak gösterir. Ayrıca yerel kitaplık bağımlılıklarını da gösterecektir.

Ücretsizdir (kişisel kullanım için) ve ilgilenen herkes için burada mevcuttur: www.netdepends.com

www.netdepends.com

Geri bildirim hoş geldiniz.


Montajları açmak için lütfen sürükle ve bırak desteği ekleyin. XCOPY dağıtımının yanı sıra kaynak kodu da mevcut olsaydı iyi olurdu.
gigaplex

Web sitesinin iki basımın olduğu bölümle bariz bir bağlantısı olmadığını ve ücretsiz olanın ticari olmayan kullanım için olduğunu fark ettim. Yardım menüsünde "Profesyonele Yükselt" seçeneğini bularak yanlışlıkla bu konuda tökezledim. İndirme sayfasında ticari kullanım için ücretsiz olmadığını belirten bir uyarı olmalıdır.
gigaplex

@gigaplex Bunların ikisini de not alacağım teşekkürler, ne yapabileceğime bakacağım.
Lloyd

1
Bir ağaç açmak için Shift tuşuna bastığınızda tüm alt öğeler de yararlı olacaktır.
TS

1
Eksik bağımlılıklar hakkında beni nasıl bilgilendiririm?
realtebo

2

http://www.amberfish.net/

ChkAsm, sürümler de dahil olmak üzere belirli bir montajın tüm bağımlılıklarını size gösterecek ve listedeki montajları kolayca aramanıza izin verecektir. Bu amaç için, ILSpy'den ( http://ilspy.net/ ) çok daha iyi çalışıyor , bu görev için kullandığım şey buydu.


1
2019 itibariyle bu site bir tür yarım yamalak görünümlü blog gibi görünüyor ...
McGuireV10

@ McGuireV10 Yani öyle. Bu talihsizlik. Ve hızlı bir google artık o uygulama için hiç isabet bulmuyor.
mhenry1384

0

Kullandığım bir başka kullanışlı Reflektör eklentisi Bağımlılık Yapısı Matrisi . Hangi sınıfların ne kullandığını görmek gerçekten harika. Üstelik ücretsizdir.


Sürüm numaralarını göstermiyor, maalesef en azından görsel stüdyo eklentisi olarak yüklenen sürüm göstermiyor.
mhenry1384

0

NET derlemenizi bu seçenekle derlemeyi deneyin --staticlink:"Namespace.Assembly". Bu, derleyiciyi derleme zamanında tüm bağımlılıkları çekmeye zorlar. Başvurulmayan bir bağımlılıkla karşılaşırsa, genellikle o derlemenin adıyla bir uyarı veya hata mesajı verir.

Namespace.Assemblybağımlılık sorunu olduğundan şüphelendiğiniz derlemedir. Genellikle bu derlemeyi statik olarak bağlamak, tüm bağımlılıklara geçişli olarak başvurur.


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.