2013-02-27 39 views

Trả lời

34

Nếu bạn muốn lập trình, hãy sử dụng Assembly.GetReferencedAssemblies.

Bạn có thể sử dụng đệ quy để tìm tất cả các hội đồng bạn cần. (Vì vậy, bạn tìm phụ thuộc của X, sau đó phụ thuộc của các phụ thuộc, vv)

+0

bạn sẽ cần phải bao gồm "using System.Reflection;" – greenfeet

+4

@ greenfeet: Không nhất thiết - bạn có thể sử dụng 'var assembly = typeof (Foo) .Assembly.GetReferencedAssemblies();' chẳng hạn. Nói chung, nó không đáng để thêm tất cả các không gian tên được sử dụng bởi tất cả các kiểu được tham chiếu trong các câu trả lời - đặc biệt không phải khi có các liên kết đến các kiểu được đề cập đến.Tôi giả định rằng độc giả hiểu đủ về ngôn ngữ C# để biết khi nào nên thêm chỉ thị 'using'. –

+0

Bạn có thể tránh việc thêm 'using System.Reflection' cho các phụ thuộc của các phụ thuộc không? Bạn sẽ không phải gọi Assembly.LoadWithPartialName (hoặc một cái gì đó tương tự) tại một số điểm? – theoski

6

Bạn có thể sử dụng bộ khung phụ thuộc http://www.dependencywalker.com để tìm hiểu điều này. Hãy lưu ý về sự khác biệt giữa x32 và x64 mặc dù.

Dependency Walker là một tiện ích miễn phí có thể quét tất cả 32-bit hoặc 64-bit của Windows mô-đun (exe, dll, ocx, sys, vv) và xây dựng một sơ đồ cây thứ bậc của tất cả các module phụ thuộc.

10

Vì câu hỏi được gắn thẻ "C#", tôi cho rằng bạn đang nói về các dll được quản lý (hội đồng). Trong trường hợp đó, dependencywalker không hữu ích. Nếu bạn muốn làm điều đó với một chương trình, những cái tốt là dotPeek bởi JetBrians và Reflector bởi RedGate. Hoặc bạn thậm chí có thể sử dụng bộ kiểm tra đối tượng trong Visual Studio.

Tuy nhiên, nó có thể là một quá trình lâu dài và rườm rà quá. Tôi sẽ viết một kịch bản C# ngắn/F # ngắn sử dụng Assembly.GetReferencedAssemblies, như Jon đã đề cập.

Nếu thay vào đó bạn muốn kiểm tra phụ thuộc DLL gốc với chương trình (mã C#), bạn phải đi kiểm tra tệp PE (định dạng tệp dll và exe) và IAT (bảng địa chỉ nhập). Không dễ dàng, nhưng không phải là không thể ...

Tôi sẽ bắt đầu here on MSDNhere để hiểu phần PE và sử dụng thư viện được quản lý để đọc nó (có rất nhiều, bao gồm một số từ dự án Mono (Tôi đang nghĩ đến Cecil) , cần làm việc với những chương trình có nguồn gốc quá); trong quá khứ tôi đã sử dụng this one từ tốt John Gough

3

Đối với cụm NET, một công cụ tuyệt vời để xem các hội đồng một lắp ráp phụ thuộc vào là AsmSpy

+2

Nó không liệt kê các hội đồng gián tiếp. – BartoszKP

2
..

Tất cả tín dụng trả lời đều được chuyển đến các tác giả trước đây để sử dụng Assembly.GetReferencedAssemblies. Đây chỉ là viết và giả mạo t C# giao diện điều khiển ứng dụng chỉ hoạt động cho các hội đồng .NET. return 0 trên các hội đồng bạn đã có thể kiểm tra và khi thành công, xuất chúng ra STDOUT. Mọi thứ khác sẽ return 1 và in một số loại đầu ra lỗi. Bạn có thể lấy gist here.

using System; 
using System.Reflection; 
using System.IO; 
namespace DotNetInspectorGadget 
{ 
    class DotNetInspectorGadget 
    { 
     static int Main(string[] args) 
     { 
      if(args.GetLength(0) < 1) 
      { 
      Console.WriteLine("Add a single parameter that is your" + 
      " path to the file you want inspected."); 
      return 1; 
      } 
      try { 
       var assemblies = Assembly.LoadFile(@args[0]).GetReferencedAssemblies(); 

       if (assemblies.GetLength(0) > 0) 
       { 
        foreach (var assembly in assemblies) 
        { 
        Console.WriteLine(assembly); 
        } 
        return 0; 
       } 
      } 
      catch(Exception e) { 
      Console.WriteLine("An exception occurred: {0}", e.Message); 
      return 1; 
      } finally{} 

      return 1; 
     } 
    } 
} 

Cách sử dụng:

call %cd%\dotnet_inspector_gadget.exe C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ConfigCI.Commands\v4.0_10.0.0.0__31bf3856ad364e35\Microsoft.ConfigCI.Commands.dll 

Output:

mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
Các vấn đề liên quan