Làm cách nào để liệt kê tất cả các hội đồng đã tải?


101

Trong .Net, tôi muốn liệt kê tất cả các hội đồng đã tải trên tất cả các AppDomains. 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 phải truy cập bằng cách nào đó mọi AppDomain không? Hoặc là đã có một công cụ làm điều này?


1
Lưu ý rằng điều đó GetAssemblies()sẽ không hoạt động, vì nó không phải là đệ quy và nó sẽ bỏ lỡ bất kỳ tham chiếu hợp ngữ lồng nhau nào. Tôi đã thêm một phiên bản đệ quy của GetAssemblies()tại stackoverflow.com/questions/383686/… .
Contango

@Contango: AppDomain.CurrentDomain.GetAssemblies()hoàn toàn ổn. Nó không cần phải duyệt tham chiếu đệ quy, bởi vì nó không liệt kê các tham chiếu ngay từ đầu.
Ben Voigt

Điều này có trả lời câu hỏi của bạn không? Làm thế nào để bạn lặp lại các hội đồng đang được tải?
UuDdLrLrSs

Câu trả lời:


94

Sử dụng Visual Studio

  1. Đính kèm trình gỡ lỗi vào quy trình (ví dụ: bắt đầu với gỡ lỗi hoặc Gỡ lỗi> Đính kèm vào quy trình)
  2. Trong khi gỡ lỗi, hãy hiển thị cửa sổ Mô-đun (Gỡ lỗi> Windows> Mô-đun)

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

nhập mô tả hình ảnh ở đây

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 Process Explorer (phần mềm miễn phí, do Microsoft xuất bản)

Nhấp 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 cụm được sử dụng. Công cụ này khá tốt vì nó hiển thị các thông tin khác như xử lý tệp, v.v.

Có lập trình

Đánh dấu vào câu hỏi SO này giải thích cách thực hiện.


1
Nó thậm chí còn tốt hơn được giải thích ở đây, bởi vì trong trang thuộc tính của một quy trình, Process Explorer hiển thị chính xác cụm AppDomain (bao gồm cả 'Miền được chia sẻ') được tải vào. Vì vậy, nó hiển thị nhiều hơn những .dlls được tải vào quy trình. Sẽ rất tuyệt nếu biết họ sử dụng API nào để hiển thị điều này (liên kết 'Lập trình' sẽ chỉ cung cấp cho các Assemblies trong CurrentDomain).
Govert

22

Đây là những gì tôi đã kết thúc với. Đó 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>");
                    }
                }
            }
        }

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 thích quáforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d

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

Thay vì sử dụng GetExecutingAssembly (), tôi đã sử dụng GetEntryAssembly () để đảm bảo rằng tôi nhận được 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 tình cờ là một DLL, tôi sẽ bỏ lỡ một vài trong số chúng.
Harry Glinos

6
hãy thử sử dụng: Assembly [] assembly = AppDomain.CurrentDomain.GetAssemblies ();
DanW
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.