2009-01-19 43 views
82

在.Net中,我想枚举所有AppDomain上的所有加载的程序集。为我的程序的AppDomain做它很容易AppDomain.CurrentDomain.GetAssemblies()。我是否需要以某种方式访问​​每个AppDomain?或者,是否有一个工具可以做到这一点?如何列出所有加载的程序集?

+0

请注意`GetAssemblies()`不起作用,因为它不是递归的,它会错过任何嵌套的程序集引用。我在http://stackoverflow.com/questions/383686/how-do-you-loop-through-currently-loaded-assemblies/26300241#26300241上添加了`GetAssemblies()`的递归版本。 – Contango 2014-10-10 15:58:29

回答

71

使用Visual Studio

  1. 附加一个调试的过程(如调试或调试开始>附加到进程)
  2. 调试时,显示模块窗口(调试>窗口>模块)

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

enter image description here

使用Process Explorer的

如果你想要一个外部工具,你可以使用Process Explorer(免费软件,Microsoft发布)

点击一个过程,它会显示一个列表与所有使用的组件。该工具是相当不错的,因为它显示其他信息,如文件句柄等

编程

检查this SO问题,解释如何做到这一点。

+1

这比在这里解释的更好,因为在一个进程的属性页面中,Process Explorer确切地显示了哪个AppDomain(包括'共享域')程序集被加载到。因此,它显示的不仅仅是将哪些.dll文件加载到进程中。很高兴知道他们使用什么API来显示它(“编程式”链接只会给CurrentDomain中的程序集)。顺便说一句 – Govert 2012-02-09 11:21:45

15

这就是我最终的结果。这是所有属性和方法的列表,并列出了每种方法的所有参数。我没有成功获得所有的价值。

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

...我排除它从初始的文章,但我过滤某些响应像这样`的foreach(在asm.GetTypes类型型()){\t \t \t \t \t \t如果((type.ToString() .IndexOf(“ACLASSIMLOOKINGFOR”)> = 0)||(type.ToString()。IndexOf(“BCLASSIMLOOKINGFOR”)> = 0)){...` – s15199d 2011-11-30 18:02:41

相关问题