Bagaimana cara menentukan ketergantungan aplikasi .NET?


106

Bagaimana cara menentukan ketergantungan aplikasi .NET? Apakah Dependency Walker berfungsi dengan aplikasi yang dikelola? Saya telah mengunduh yang terbaru dan mencoba membuat profil aplikasi, tetapi aplikasi itu keluar begitu saja tanpa banyak penjelasan. Jika tidak berfungsi dengan .NET, apakah ada alat lain yang akan membantu saya men-debug masalah pemuatan DLL run-time?

Jawaban:


94

Dependency walker bekerja pada biner win32 normal. Semua .NET dll dan exe memiliki bagian header rintisan kecil yang membuat mereka terlihat seperti binari normal, tetapi pada dasarnya semua itu mengatakan "memuat CLR" - jadi hanya itu yang akan diberitahukan oleh alat bantu jalan ketergantungan kepada Anda.

Untuk melihat hal mana yang benar-benar diandalkan oleh aplikasi .NET Anda, Anda dapat menggunakan reflektor .NET yang sangat bagus dari Red Gate. (EDIT: Perhatikan bahwa .NET Reflector sekarang menjadi produk berbayar. ILSpy gratis dan open source dan sangat mirip.)

Load DLL Anda ke dalamnya, klik kanan, dan pilih 'Analyze' - Anda akan melihat item "Depends On" yang akan menampilkan semua dll lainnya (dan metode di dalam dll itu) yang dibutuhkan.

Kadang-kadang bisa menjadi lebih rumit, karena aplikasi Anda bergantung pada X dll, dan X dll ada, tetapi karena alasan apa pun tidak dapat dimuat atau ditempatkan saat runtime.

Untuk memecahkan masalah semacam itu, Microsoft memiliki Penampil Log Mengikat Majelis yang dapat menunjukkan kepada Anda apa yang terjadi saat runtime


Saya pikir Anda melewatkan sedikit dari URL itu - .aspx dimasukkan ke dalam teks tautan. Aku berhasil menemukannya.
Brian Stewart

oh ... ya, kontrol penurunan harga memakan tanda kurung di URL, dan sayangnya MSDN menempatkan (VS80) di semua url :-(
Orion Edwards

44
Perhatikan bahwa mulai awal 2011, .NET Reflector tidak lagi gratis. Proyek ILSpy open source sangat mirip.
yoyo

1
Assembly Binding Log View v4.0.30319.1 sama sekali tidak dapat digunakan. Entri log tidak ditampilkan dalam urutan kronologis dan Anda tidak dapat mengurutkannya. Ini menampilkan jalur yang tidak sesuai dengan penampil dan Anda tidak dapat mengubah ukurannya. Buang-buang waktu saja.
Neutrino

dependencywalker.com Anda harus menyertakan url hal-hal yang Anda sebutkan, khususnya. jika mereka bekerja.
toddmo

54

Saya menemukan utilitas kecil AsmSpy alat yang sangat berharga untuk menyelesaikan masalah dengan rakitan pemuatan. Ini mencantumkan semua referensi rakitan dari rakitan terkelola termasuk versi rakitan.

Jalankan dalam prompt perintah di direktori .dlldengan argumen berikut:

asmspy . all

tangkapan layar keluaran asmspy

Instal dengan cepat dengan Chocolatey:

choco install asmspy

Bisakah ini bekerja pada file C # atau tampilan Razor juga? Saya membuat sub proyek dengan mengekspor beberapa tampilan dan pengontrol dari proyek mvc pada saat dijalankan. Dan saya ingin tahu dependensi apa yang diperlukan oleh Views ini dan pengontrol sehingga saya dapat menyalin dependensi ini juga pada saat berjalan untuk membuat subproyek dapat dipublikasikan sebagai proyek web terpisah di IIS.
Rupendra

25

Buka file assembly di ILDASM dan cari @ .assembly extern di MANIFEST


1
Dapatkah saya melihat versi rakitan dependen seperti ini juga? Saya hanya melihat nama dependensi, bukan versinya juga.
Michael R

Sebenarnya, ya, saya juga dapat melihat versi rakitan dependen dengan cara ini, setelah mengklik "MANIFES T"
Michael R

1
Saya lebih suka yang ini - tidak perlu mengunduh utilitas tambahan jika Anda bekerja di lingkungan pengembang
Dan Field

Saat men-debug aplikasi pihak ketiga crash, bagaimana cara menginstal hanya ildasm pada pelanggan?
realtebo

18

Untuk menjelajahi dependensi kode .NET, Anda dapat menggunakan kapabilitas alat NDepend. Alat tersebut mengusulkan:

Misalnya kueri seperti itu bisa terlihat seperti:

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 }

Dan hasilnya terlihat seperti: (perhatikan kedalaman metrik kode , 1 untuk penelepon langsung, 2 untuk penelepon langsung ...) (perhatikan juga tombol Export to Graph untuk mengekspor hasil query ke Call Graph )

Dependensi NDependen menjelajah melalui kueri C # LINQ

Grafik ketergantungan terlihat seperti:

NDependency Graph

Matriks ketergantungan terlihat seperti:

NDependency Matrix

Matriks dependensi secara de-facto kurang intuitif dibandingkan grafik, tetapi lebih cocok untuk menjelajahi bagian kode yang kompleks seperti:

NDepend Matrix vs Graph

Penafian: Saya bekerja untuk NDepend


2
Patrick mungkin seharusnya menyebutkan bahwa dia adalah penulis alat yang luar biasa itu;). Ini sangat layak untuk dicoba. 1 untuk menulisnya!
Mitch Wheat

1
Hei, aku baru menyadarinya sendiri. Saya menikmati membaca posting blognya - Saya harus mencoba NDepend!
Brian Stewart

2
@MitchWheat - nama memeriksa haha, "Patrick dari tim NDepend"
kayleeFrye_onDeck

Bisakah saya menggunakan dengan VStudio? Untuk men-debug aplikasi pihak ketiga yang mogok di bukan PC saya
realtebo

16

Anda tidak perlu mengunduh dan menginstal aplikasi atau alat shareware. Anda dapat melakukannya secara terprogram dari .NET menggunakanAssembly.GetReferencedAssemblies()

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

9
Untuk keperluan debugging, itu lebih mudah untuk melakukan hal ini melalui PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Memiliki keuntungan bagus karena tidak mengunduh atau berburu lokasi Windows yang tidak jelas untuk alat. +1
jpmc26

3
perbaiki saya jika saya salah tetapi ini hanya akan memberi Anda kesalahan yang sama yang diberikan aplikasi Anda dengan ketergantungan yang hilang sehingga tidak terlalu berguna
jk.

Ini hanya berfungsi ketika rakitan dimuat ke AppDomain. Assemblies dimuat untuk Reflection mengembalikan satu set null.
David A. Gray

7

Jika Anda menggunakan toolchain Mono, Anda dapat menggunakan yang monodisutilitas dengan --assemblyrefargumen untuk daftar dependensi NET perakitan. Ini akan bekerja pada file .exedan .dll.

Contoh penggunaan:

monodis --assemblyref somefile.exe

Contoh keluaran (.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

Contoh keluaran (.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

Aktifkan pencatatan pengikatan perakitan menetapkan nilai registri EnableLog di HKLM \ Software \ Microsoft \ Fusion ke 1. Perhatikan bahwa Anda harus memulai ulang aplikasi Anda (gunakan iisreset) agar perubahan dapat berpengaruh.

Tip: Ingatlah untuk mematikan pencatatan fusi setelah Anda selesai karena ada hukuman kinerja untuk menyalakannya.


5

Lucu sekali saya memiliki masalah yang sama dan tidak menemukan sesuatu yang cocok dan menyadari Dependency Walker yang baik sehingga pada akhirnya saya menulisnya sendiri.

Ini berhubungan dengan .NET secara khusus dan akan menunjukkan referensi apa yang dimiliki oleh assembly (dan hilang) secara rekursif. Ini juga akan menunjukkan dependensi perpustakaan asli.

Gratis (untuk penggunaan pribadi) dan tersedia di sini untuk siapa saja yang tertarik: www.netdepends.com

www.netdepends.com

Umpan balik diterima.


Harap tambahkan dukungan seret dan lepas untuk membuka majelis. Akan lebih baik jika penyebaran XCOPY tersedia, serta kode sumber.
gigaplex

Saya baru saja memperhatikan bahwa situs web tidak memiliki tautan yang jelas ke bagian di mana ada dua edisi, dan yang gratis untuk penggunaan non-komersial. Saya tidak sengaja tersandung pada ini dengan menemukan opsi "Upgrade ke Profesional" di menu Bantuan. Harus ada pemberitahuan di halaman unduhan yang mengatakan bahwa itu tidak gratis untuk penggunaan komersial.
gigaplex

@gigaplex Saya akan mencatat kedua terima kasih ini, saya akan melihat apa yang dapat saya lakukan.
Lloyd

1
Shiftclick untuk membuka pohon dan semua subitem akan berguna juga.
TS

1
Bagaimana memberi tahu saya tentang dependensi yang hilang?
realtebo

2

http://www.amberfish.net/

ChkAsm akan menunjukkan semua dependensi rakitan tertentu sekaligus, termasuk versinya, dan dengan mudah membiarkan Anda mencari rakitan dalam daftar. Bekerja jauh lebih baik untuk tujuan ini daripada ILSpy ( http://ilspy.net/ ), yang biasa saya gunakan untuk tugas ini.


1
Pada 2019 situs itu tampaknya semacam blog yang tampak samar ...
McGuireV10

@ McGuireV10 Jadi itu. Itu sangat disayangkan. Dan Google yang cepat ternyata tidak lagi berhasil untuk aplikasi itu.
mhenry1384

0

Add-in Reflector berguna lainnya yang saya gunakan adalah Dependency Structure Matrix . Sangat menyenangkan melihat kelas mana yang menggunakan apa. Ditambah gratis.


Tidak menunjukkan nomor versi, sayangnya, setidaknya versi yang diinstal sebagai add-in studio visual tidak.
mhenry1384

0

Coba kompilasi perakitan .NET Anda dengan opsi --staticlink:"Namespace.Assembly". Ini memaksa kompilator untuk menarik semua dependensi pada waktu kompilasi. Jika menemukan ketergantungan yang tidak direferensikan itu akan memberikan peringatan atau pesan kesalahan biasanya dengan nama rakitan itu.

Namespace.Assemblyadalah rakitan yang Anda curigai mengalami masalah ketergantungan. Biasanya hanya menghubungkan perakitan ini secara statis akan mereferensikan semua dependensi secara transitif.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.