Як перерахувати всі завантажені збірки?


101

У .Net, я хотів би перерахувати всі завантажені збірки за всіма AppDomains. Зробити це для AppDomain моєї програми досить просто AppDomain.CurrentDomain.GetAssemblies(). Чи потрібно мені якимось чином отримувати доступ до кожного AppDomain? Або вже є інструмент, який це робить?


1
Зауважте, що GetAssemblies()це не буде працювати, оскільки воно не є рекурсивним, і він пропустить будь-які вкладені посилання на збірку. Я додав рекурсивную версію GetAssemblies()в stackoverflow.com/questions/383686 / ... .
Контанго

@Contango: AppDomain.CurrentDomain.GetAssemblies()прекрасно. Для цього не потрібно звертатися до посилань рекурсивно, оскільки це не перерахування посилань.
Ben Voigt

Відповіді:


95

Використання Visual Studio

  1. Приєднайте налагоджувач до процесу (наприклад, почніть з налагодження або Налагодження> Приєднати до процесу)
  2. Під час налагодження покажіть вікно Модулі (Налагодження> Windows> Модулі)

Це дає детальну інформацію про кожну збірку, домен програми та має кілька варіантів для завантаження символів (тобто файлів pdb, що містять інформацію про налагодження).

введіть тут опис зображення

Використання Провідника процесів

Якщо вам потрібен зовнішній інструмент, ви можете скористатися Провідником процесів (безкоштовна версія , опублікована Microsoft)

Натисніть на процес, і він покаже список із усіма використаними збірками. Інструмент досить хороший, оскільки показує іншу інформацію, таку як ручки файлів тощо.

Програмно

Перевірте це питання, що пояснює, як це зробити.


1
Це навіть краще, ніж тут пояснено, оскільки на сторінці властивостей процесу, Провідник процесів показує, в які саме компоненти завантажуються збірки AppDomain (включаючи "Спільний домен"). Так він показує більше, ніж просто, які .dlls завантажуються в процес. Було б непогано знати, які API вони використовують для того, щоб показати це (посилання "Програмно" просто дасть збори в CurrentDomain).
Govert

22

Ось що я закінчив. Це перелік усіх властивостей і методів, і я перерахував усі параметри для кожного методу. Мені не вдалося отримати всі цінності.

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 ... Я виключив це з початкової публікації, але я відфільтрував деякі відповіді, як-от такforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d

2
Це зовсім не відповідає на питання.
Govert

Замість використання GetExecutingAssembly () я використав GetEntryAssembly (), щоб переконатися, що я отримую кращий список зборів, використовуваних моєю програмою. Якщо у ExecutingAssembly трапляється DLL, я пропущу деякі з них.
Гаррі Глінос

6
спробуйте використовувати: Assembly [] асамблеї = AppDomain.CurrentDomain.GetAssemblies ();
DanW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.