Làm cách nào để xác định phần phụ thuộc của ứng dụng .NET?


106

Làm cách nào để xác định phần phụ thuộc của ứng dụng .NET? Liệu Dependency Walker làm việc với các ứng dụng quản lý? Tôi đã tải xuống bản mới nhất và thử lập hồ sơ ứng dụng, nhưng nó chỉ thoát ra mà không có nhiều lời giải thích. Nếu nó không hoạt động với .NET, thì có một số công cụ khác có thể giúp tôi gỡ lỗi sự cố tải DLL trong thời gian chạy không?

Câu trả lời:


94

Trình đi bộ phụ thuộc hoạt động trên các tệp nhị phân win32 bình thường. Tất cả các dll của .NET và exe đều có một phần tiêu đề sơ khai nhỏ khiến chúng trông giống như các tệp nhị phân bình thường, nhưng về cơ bản tất cả những gì nó nói là "tải CLR" - vì vậy đó là tất cả những gì mà bộ đi phụ thuộc sẽ cho bạn biết.

Để xem ứng dụng .NET của bạn thực sự dựa vào những thứ nào, bạn có thể sử dụng trình phản xạ .NET cực kỳ xuất sắc từ Red Gate. (CHỈNH SỬA: Lưu ý rằng .NET Reflector hiện là sản phẩm trả phí. ILSpy là nguồn mở miễn phí và rất giống.)

Tải DLL của bạn vào đó, nhấp chuột phải và chọn 'Phân tích' - sau đó bạn sẽ thấy mục "Phụ thuộc vào" sẽ hiển thị cho bạn tất cả các dll khác (và các phương pháp bên trong các dll đó) mà nó cần.

Tuy nhiên, đôi khi nó có thể phức tạp hơn, trong đó ứng dụng của bạn phụ thuộc vào X dll và X dll hiện diện, nhưng vì bất kỳ lý do gì không thể tải hoặc nằm trong thời gian chạy.

Để khắc phục những loại vấn đề đó, Microsoft có Trình xem nhật ký liên kết ràng buộc có thể hiển thị cho bạn những gì đang diễn ra trong thời gian chạy


Tôi nghĩ rằng bạn đã bỏ sót một chút URL đó - .aspx đã được đưa vào văn bản liên kết. Tôi đã quản lý để tìm thấy nó mặc dù.
Brian Stewart

oh ... vâng, điều khiển đánh dấu ăn dấu ngoặc trong URL và tiếc là MSDN đặt (VS80) trong tất cả các url của nó :-(
Orion Edwards

44
Lưu ý rằng kể từ đầu năm 2011, .NET Reflector không còn miễn phí nữa. Dự án ILSpy mã nguồn mở cũng tương tự như vậy.
yoyo

1
Assembly Binding Log View v4.0.30319.1 hoàn toàn không thể sử dụng được. Các mục nhật ký không được hiển thị theo thứ tự thời gian và bạn không thể sắp xếp chúng. Nó hiển thị các đường dẫn không vừa với người xem và bạn không thể thay đổi kích thước của nó. Thật lãng phí thời gian.
Neutrino

dependencywalker.com Bạn nên bao gồm các url của những thứ bạn đề cập, đặc biệt. nếu chúng hoạt động.
toddmo

54

Tôi thấy tiện ích nhỏ AsmSpy là một công cụ vô giá để giải quyết các vấn đề với việc tải các tập hợp. Nó liệt kê tất cả các tham chiếu lắp ráp của các hợp ngữ được quản lý bao gồm các phiên bản hợp ngữ.

Chạy nó trong một dấu nhắc lệnh trong thư mục của .dllvới các đối số sau:

asmspy . all

ảnh chụp màn hình đầu ra asmspy

Cài đặt nó một cách nhanh chóng với Chocolatey:

choco install asmspy

Nó có thể hoạt động trên các tệp C # hoặc dạng xem Razor không? Tôi đang tạo một dự án con bằng cách xuất một số chế độ xem và bộ điều khiển từ một dự án mvc tại thời điểm chạy. Và tôi muốn biết những phụ thuộc nào được yêu cầu bởi các Chế độ xem này và bộ điều khiển để tôi có thể sao chép những phụ thuộc này vào thời gian chạy để làm cho dự án con có thể xuất bản dưới dạng một dự án web riêng biệt trên IIS.
Rupendra

25

Mở tệp lắp ráp trong ILDASM và tìm @ .assembly bên ngoài trong MANIFEST


1
Tôi cũng có thể xem phiên bản của các assembly phụ thuộc theo cách này không? Tôi chỉ thấy tên phụ thuộc, không phải phiên bản của nó.
Michael R

Trên thực tế, có, tôi cũng có thể xem phiên bản của các tập hợp phụ thuộc theo cách này, khi nhấp vào "MANIFES T"
Michael R

1
Tôi thích cái này - không cần phải tải về bất kỳ tiện ích bổ sung nếu bạn đang làm việc trong một môi trường dev
Dan Dòng

Khi gỡ lỗi sự cố ứng dụng của bên thứ ba, làm thế nào để chỉ cài đặt ildasm trên khách hàng của?
realtebo

18

Để duyệt các phụ thuộc mã .NET, bạn có thể sử dụng các khả năng của công cụ NDepend. Công cụ đề xuất:

Ví dụ, truy vấn như vậy có thể trông như sau:

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 }

Và kết quả của nó giống như sau: (thông báo độ sâu số liệu mã , 1 là cho người gọi trực tiếp, 2 cho người gọi của người gọi trực tiếp ...) (cũng lưu ý nút Xuất sang biểu đồ để xuất kết quả truy vấn sang Biểu đồ cuộc gọi )

Bỏ qua các phụ thuộc duyệt qua truy vấn C # LINQ

Biểu đồ phụ thuộc có dạng như sau:

Biểu đồ phụ thuộc NDepend

Ma trận phụ thuộc có dạng như sau:

Ma trận phụ thuộc NDepend

Trên thực tế, ma trận phụ thuộc ít trực quan hơn so với biểu đồ, nhưng nó phù hợp hơn để duyệt qua các phần mã phức tạp như:

NDepend Matrix vs Graph

Tuyên bố từ chối trách nhiệm: Tôi làm việc cho NDepend


2
Patrick có lẽ nên nói rằng anh ấy là tác giả của công cụ tuyệt vời đó;). Nó thực sự đáng để kiểm tra. +1 vì đã viết nó!
Mitch Wheat

1
Này, tôi chỉ nhận thấy điều này bản thân mình. Tôi thích đọc các bài đăng trên blog của anh ấy - Tôi sẽ phải thử NDepend!
Brian Stewart

2
@MitchWheat - tên kiểm tra ra haha, "Patrick từ đội NDepend"
kayleeFrye_onDeck

Tôi có thể sử dụng với VStudio không? Để gỡ lỗi sự cố ứng dụng của các ứng dụng bên thứ ba không phải trên máy tính của tôi
realtebo

16

Bạn không cần tải xuống và cài đặt các ứng dụng hoặc công cụ phần mềm chia sẻ. Bạn có thể làm điều đó một cách lập trình từ .NET bằng cách sử dụngAssembly.GetReferencedAssemblies()

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

9
Đối với mục đích gỡ lỗi, đó là thuận tiện hơn để làm điều này thông qua PowerShell: [Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies(). Có lợi thế tuyệt vời là không phải tải xuống hoặc tìm kiếm các vị trí Windows bị che khuất cho các công cụ. +1
jpmc26

3
Hãy sửa cho tôi nếu tôi sai nhưng điều này sẽ chỉ mang lại cho bạn lỗi giống như ứng dụng của bạn bị thiếu phụ thuộc gây ra nên không hữu ích lắm
jk.

Điều này chỉ hoạt động khi lắp ráp được tải vào AppDomain. Các tập hợp được tải cho Reflection trả về một tập hợp rỗng.
David A. Gray,

7

Nếu bạn đang sử dụng toolchain Mono, bạn có thể sử dụng các monodistiện ích với các --assemblyreflập luận để liệt kê các phụ thuộc của một NET lắp ráp. Điều này sẽ hoạt động trên cả tệp .exe.dlltệp.

Ví dụ sử dụng:

monodis --assemblyref somefile.exe

Ví dụ đầu ra (.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

Ví dụ đầu ra (.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

Bật ghi nhật ký liên kết lắp ráp đặt giá trị đăng ký EnableLog in HKLM \ Software \ Microsoft \ Fusion thành 1. Lưu ý rằng bạn phải khởi động lại ứng dụng của mình (sử dụng iisreset) để các thay đổi có hiệu lực.

Mẹo: Hãy nhớ tắt tính năng ghi nhật ký hợp nhất khi bạn hoàn tất vì có một hình phạt hiệu suất để bật tính năng này.


5

Thật buồn cười khi tôi gặp một vấn đề tương tự và không tìm thấy bất cứ điều gì phù hợp và nhận thức được Dependency Walker cũ tốt nên cuối cùng tôi đã tự viết một bài.

Điều này liên quan cụ thể đến .NET và sẽ hiển thị những tham chiếu nào mà một hợp ngữ có (và thiếu) một cách đệ quy. Nó cũng sẽ hiển thị các phụ thuộc thư viện gốc.

Nó miễn phí (cho mục đích sử dụng cá nhân) và có sẵn tại đây cho bất kỳ ai quan tâm: www.netdepends.com

www.netdepends.com

Phản hồi hoan nghênh.


Vui lòng thêm hỗ trợ kéo và thả để mở các hội đồng. Sẽ rất tuyệt nếu có sẵn việc triển khai XCOPY cũng như mã nguồn.
gigaplex

Tôi chỉ nhận thấy rằng trang web không có bất kỳ liên kết rõ ràng nào đến phần có hai phiên bản và phiên bản miễn phí dành cho mục đích phi thương mại. Tôi vô tình gặp phải điều này khi tìm tùy chọn "Nâng cấp lên Chuyên nghiệp" trong menu Trợ giúp. Sẽ có một thông báo trên trang tải xuống nói rằng nó không miễn phí cho mục đích thương mại.
gigaplex

@gigaplex Tôi sẽ ghi nhớ cả hai điều này, cảm ơn, tôi sẽ xem tôi có thể làm gì.
Lloyd

1
Shiftclick để mở một cái cây và tất cả các subitems cũng sẽ hữu ích.
TS

1
Làm thế nào để thông báo cho tôi về những phụ thuộc bị thiếu?
realtebo

2

http://www.amberfish.net/

ChkAsm sẽ hiển thị cho bạn tất cả các phụ thuộc của một assembly cụ thể cùng một lúc, bao gồm cả các phiên bản và dễ dàng cho phép bạn tìm kiếm các assembly trong danh sách. Hoạt động tốt hơn nhiều cho mục đích này so với ILSpy ( http://ilspy.net/ ), đó là những gì tôi đã sử dụng cho nhiệm vụ này.


1
Tính đến năm 2019 rằng trang web dường như là một số loại của blog sơ sài nhìn ...
McGuireV10

@ McGuireV10 Vì vậy, nó là. Thật không may. Và google nhanh chóng không có lượt truy cập nào cho ứng dụng đó nữa.
mhenry1384

0

Một bổ trợ Reflector tiện dụng khác mà tôi sử dụng là Ma trận cấu trúc phụ thuộc . Nó thực sự tuyệt vời để xem những lớp học sử dụng những gì Thêm vào đó, nó miễn phí.


Rất tiếc, không hiển thị số phiên bản, ít nhất là phiên bản cài đặt dưới dạng tiện ích bổ sung studio trực quan thì không.
mhenry1384

0

Hãy thử biên dịch lắp ráp .NET của bạn với tùy chọn --staticlink:"Namespace.Assembly". Điều này buộc trình biên dịch phải kéo vào tất cả các phụ thuộc tại thời điểm biên dịch. Nếu nó bắt gặp một phụ thuộc không được tham chiếu, nó sẽ đưa ra một cảnh báo hoặc thông báo lỗi thường có tên của assembly đó.

Namespace.Assemblylà lắp ráp mà bạn nghi ngờ là có vấn đề phụ thuộc. Thông thường, chỉ cần liên kết tĩnh assembly này sẽ tham chiếu chuyển tiếp tất cả các phụ thuộc.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.