2009-01-19 23 views
82

Trong .Net, tôi muốn liệt kê tất cả các assembly được nạp trên tất cả các AppDomain. Làm điều đó cho AppDomain của chương trình của tôi là đủ dễ dàng AppDomain.CurrentDomain.GetAssemblies(). Tôi có cần bằng cách nào đó truy cập mọi AppDomain không? Hay đã có một công cụ thực hiện điều này?Làm cách nào để liệt kê tất cả các cụm được nạp?

+0

Lưu ý rằng 'GetAssemblies()' sẽ không hoạt động, vì nó không đệ quy và sẽ bỏ qua bất kỳ tham chiếu lắp ráp lồng nhau nào. Tôi đã thêm một phiên bản đệ quy của 'GetAssemblies()' tại http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded-assemblies/26300241#26300241. – Contango

Trả lời

71

Sử dụng Visual Studio

  1. Đính kèm một debugger để quá trình này (ví dụ như bắt đầu với gỡ lỗi hoặc Debug> Đính kèm để xử lý)
  2. Trong khi gỡ lỗi, hiển thị cửa sổ Modules (Debug> Windows> Mô-đun)

Điều này cung cấp chi tiết về từng miền, miền ứng dụng và có một vài tùy chọn để tải biểu tượng (tức là tệp pdb chứa thông tin gỡ lỗi).

enter image description here

Sử dụng Process Explorer

Nếu bạn muốn một công cụ bên ngoài bạn có thể sử dụng (phần mềm miễn phí, phát hành bởi Microsoft) Process Explorer

Nhấn vào một quá trình và nó sẽ hiển thị một danh sách với tất cả các hội đồng được sử dụng. Công cụ này là khá tốt vì nó cho thấy các thông tin khác như xử lý tập tin, vv

lập trình

Kiểm tra this SO câu hỏi đó giải thích làm thế nào để làm điều đó.

+1

Nó thậm chí còn tốt hơn so với giải thích ở đây, bởi vì trong trang thuộc tính cho một quá trình, Process Explorer cho thấy chính xác mà AppDomain (bao gồm cả 'Shared Domain') hội đồng được nạp vào. Vì vậy, nó cho thấy nhiều hơn chỉ là dll được nạp vào quá trình này. Nó sẽ được tốt đẹp để biết những gì họ sử dụng API để hiển thị này (liên kết 'Programmatically' về sẽ chỉ cung cấp cho các hội đồng trong CurrentDomain). – Govert

15

Đây là những gì tôi đã kết thúc. Đó là danh sách tất cả các thuộc tính và phương thức, và tôi liệt kê tất cả các tham số cho mỗi phương thức. Tôi đã không thành công khi nhận được tất cả các giá trị.

foreach(System.Reflection.AssemblyName an in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()){      
      System.Reflection.Assembly asm = System.Reflection.Assembly.Load(an.ToString()); 
      foreach(Type type in asm.GetTypes()){ 
       //PROPERTIES 
       foreach (System.Reflection.PropertyInfo property in type.GetProperties()){ 
        if (property.CanRead){ 
         Response.Write("<br>" + an.ToString() + "." + type.ToString() + "." + property.Name);  
        } 
       } 
       //METHODS 
       var methods = type.GetMethods(); 
       foreach (System.Reflection.MethodInfo method in methods){    
        Response.Write("<br><b>" + an.ToString() + "." + type.ToString() + "." + method.Name + "</b>"); 
        foreach (System.Reflection.ParameterInfo param in method.GetParameters()) 
        { 
         Response.Write("<br><i>Param=" + param.Name.ToString()); 
         Response.Write("<br> Type=" + param.ParameterType.ToString()); 
         Response.Write("<br> Position=" + param.Position.ToString()); 
         Response.Write("<br> Optional=" + param.IsOptional.ToString() + "</i>"); 
        } 
       } 
      } 
     } 
+0

btw ... Tôi loại trừ nó ra khỏi bài ban đầu, nhưng tôi lọc một số các câu trả lời như vậy 'foreach (Type gõ vào asm.GetTypes()) {\t \t \t \t \t \t if ((type.ToString() .IndexOf ("ACLASSIMLOOKINGFOR")> = 0) || (type.ToString(). IndexOf ("BCLASSIMLOOKINGFOR")> = 0)) {... ' – s15199d

+2

Điều này không trả lời được câu hỏi nào cả. – Govert

+0

Thay vì sử dụng GetExecutingAssembly(), tôi đã sử dụng GetEntryAssembly() để đảm bảo rằng tôi nhận được một danh sách tốt hơn các Assemblies được chương trình của tôi sử dụng. Nếu ExecutingAssembly xảy ra là một DLL, tôi sẽ bỏ lỡ một vài trong số chúng. –

Các vấn đề liên quan