如何列出所有已加载的程序集?


101

在.Net中,我想枚举所有AppDomain上所有加载的程序集。为我的程序的AppDomain做到这一点很容易AppDomain.CurrentDomain.GetAssemblies()。我需要以某种方式访问​​每个AppDomain吗?还是已经有执行此操作的工具?


1
注意,GetAssemblies()这是行不通的,因为它不是递归的,并且会遗漏任何嵌套的程序集引用。我GetAssemblies()stackoverflow.com/questions/383686/…中添加了递归版本。
康坦戈2014年

@Contango:AppDomain.CurrentDomain.GetAssemblies()很好。它不需要递归地遍历引用,因为它不是一开始就枚举引用。
Ben Voigt

这回答了你的问题了吗?如何遍历当前加载的程序集?
UuDdLrLrSs

Answers:


95

使用Visual Studio

  1. 将调试器附加到进程(例如,从调试开始或“调试”>“附加到进程”)
  2. 调试时,显示“模块”窗口(“调试”>“ Windows”>“模块”)

这提供了有关每个程序集,应用程序域的详细信息,并具有一些加载符号(即包含调试信息的pdb文件)的选项。

在此处输入图片说明

使用流程浏览器

如果需要外部工具,则可以使用Process Explorer(免费软件,由Microsoft发布)

单击一个过程,它将显示一个列表,其中包含所有使用的组件。该工具相当不错,因为它可以显示其他信息,例如文件句柄等。

以编程方式

检查此SO问题,问题说明了如何执行。


1
它甚至比这里解释的要好,因为在流程的属性页中,Process Explorer会准确显示要加载到哪个AppDomain(包括“ Shared Domain”)程序集。因此,它不仅仅显示将哪些.dll加载到进程中。很高兴知道他们使用了哪些API来显示此信息(“以编程方式”链接将仅在CurrentDomain中提供程序集)。
Govert,2012年

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>");
                    }
                }
            }
        }

顺便说一句...我从最初的帖子中排除了它,但是我过滤了一些类似的回复foreach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d

2
这根本无法回答问题。
Govert,2012年

我没有使用GetExecutingAssembly(),而是使用GetEntryAssembly()来确保获得程序使用的更好的Assemblies列表。如果ExecutingAssembly恰好是DLL,我将错过其中的一些。
哈里·格林诺斯

6
尝试使用:Assembly []组件= AppDomain.CurrentDomain.GetAssemblies();
DanW
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.