Как мне вывести список всех загруженных сборок?

101

В .Net я хотел бы перечислить все загруженные сборки по всем доменам приложений. Сделать это для AppDomain моей программы достаточно просто AppDomain.CurrentDomain.GetAssemblies(). Нужно ли мне каким-то образом получать доступ к каждому домену приложений? Или уже есть инструмент, который это делает?

Абтин Форузанде
источник
1
Обратите внимание, что GetAssemblies()это не сработает, так как оно не рекурсивно и будет пропускать любые ссылки на вложенные сборки. Я добавил рекурсивную версию GetAssemblies()на stackoverflow.com/questions/383686/… .
Contango
@Contango: AppDomain.CurrentDomain.GetAssemblies()все в порядке. Ему не нужно рекурсивно обходить ссылки, потому что он в первую очередь не перечисляет ссылки.
Ben Voigt

Ответы:

97

Использование Visual Studio

  1. Присоедините отладчик к процессу (например, начните с отладки или Отладка> Присоединить к процессу)
  2. Во время отладки покажите окно модулей (Отладка> Windows> Модули)

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

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

Использование Process Explorer

Если вам нужен внешний инструмент, вы можете использовать Process Explorer (бесплатное программное обеспечение, опубликованное Microsoft)

Щелкните процесс, и он покажет список со всеми используемыми сборками. Инструмент довольно хорош, поскольку показывает другую информацию, такую ​​как дескрипторы файлов и т. Д.

Программно

Отметьте этот вопрос SO, который объясняет, как это сделать.

Богдан Гаврил МСФТ
источник
2
Это даже лучше, чем объясняется здесь, потому что на странице свойств процесса Process Explorer показывает, в какие именно сборки AppDomain (включая «Shared Domain») загружаются сборки. Таким образом, он показывает не только то, какие .dll загружены в процесс. Было бы неплохо узнать, какие API-интерфейсы они используют, чтобы показать это (ссылка «Программно» просто предоставит сборки в CurrentDomain).
Говерт
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>");
                    }
                }
            }
        }
s15199d
источник
кстати ... Я исключил его из исходного сообщения, но отфильтровал некоторые ответы примерно так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 [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW