Jak wyświetlić listę wszystkich załadowanych zestawów?

101

W .Net chciałbym wyliczyć wszystkie załadowane zestawy we wszystkich domenach AppDomains. Zrobienie tego dla domeny AppDomain mojego programu jest dość łatwe AppDomain.CurrentDomain.GetAssemblies(). Czy muszę w jakiś sposób uzyskać dostęp do każdej domeny AppDomain? A może jest już narzędzie, które to robi?

Abtin Forouzandeh
źródło
1
Zauważ, że GetAssemblies()to nie zadziała, ponieważ nie jest cykliczne i spowoduje pominięcie jakichkolwiek zagnieżdżonych odwołań do zestawu. Dodałem rekurencyjną wersję strony GetAssemblies()na stackoverflow.com/questions/383686/… .
Contango,
@Contango: wszystko w AppDomain.CurrentDomain.GetAssemblies()porządku. Nie musi rekurencyjnie chodzić po referencjach, ponieważ w pierwszej kolejności nie wylicza referencji.
Ben Voigt,
Czy to odpowiada na twoje pytanie? Jak przeglądać aktualnie załadowane zestawy?
UuDdLrLrSs

Odpowiedzi:

95

Korzystanie z programu Visual Studio

  1. Dołącz debugger do procesu (np. Zacznij od debugowania lub Debug> Attach to process)
  2. Podczas debugowania pokaż okno Moduły (Debuguj> Windows> Moduły)

Daje to szczegółowe informacje o każdym zestawie, domenie aplikacji i ma kilka opcji ładowania symboli (tj. Plików pdb, które zawierają informacje o debugowaniu).

wprowadź opis obrazu tutaj

Korzystanie z Process Explorer

Jeśli chcesz mieć zewnętrzne narzędzie, możesz użyć Process Explorer (darmowy, opublikowany przez Microsoft)

Kliknij proces, aby wyświetlić listę wszystkich użytych zespołów. Narzędzie jest całkiem dobre, ponieważ pokazuje inne informacje, takie jak uchwyty plików itp.

Programowo

Sprawdź to pytanie SO, które wyjaśnia, jak to zrobić.

Bogdan Gavril MSFT
źródło
1
Jest to nawet lepsze niż wyjaśniono tutaj, ponieważ na stronie właściwości procesu Process Explorer pokazuje dokładnie, do których zestawów AppDomain (w tym „Shared Domain”) są ładowane zestawy. Pokazuje więc więcej niż tylko pliki .dll ładowane do procesu. Byłoby miło wiedzieć, jakich interfejsów API używają, aby to pokazać (łącze „Programowe” o nazwie po prostu podaje zestawy w CurrentDomain).
Govert
22

Oto, z czym skończyłem. Jest to lista wszystkich właściwości i metod, a ja wymieniłem wszystkie parametry dla każdej metody. Nie udało mi się uzyskać wszystkich wartości.

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
źródło
btw ... wykluczyłem to z początkowego postu, ale odfiltrowałem niektóre odpowiedzi w ten sposóbforeach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d
2
To wcale nie odpowiada na pytanie.
Govert
Zamiast używać GetExecutingAssembly (), użyłem GetEntryAssembly (), aby upewnić się, że otrzymuję lepszą listę zestawów używanych przez mój program. Jeśli plik ExecutingAssembly jest biblioteką DLL, przegapię kilka z nich.
Harry Glinos
6
spróbuj użyć: Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies ();
DanW