C #: Alle Klassen in Assembly auflisten

102

Ich möchte (programmgesteuert - C #) eine Liste aller Klassen in meiner Assembly ausgeben.

Irgendwelche Hinweise oder Beispielcode, wie das geht? Reflexion?

Alex
quelle
Wenn Sie beabsichtigen, eine Baugruppe zu untersuchen, auf die Ihr Projekt nicht verweist, lesen Sie meine aktualisierte Antwort.
Thorarin

Antworten:

150

Verwenden Sie Assembly.GetTypes. Beispielsweise:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}
Jon Skeet
quelle
1
Anregungen für große Baugruppen? Wenn ich diesen Code für eine 13,8-MB-Assembly ausführe, bleibt meine VS-Instanz auf unbestimmte Zeit hängen. Ich habe eine kleine 9-KB-Baugruppe ausprobiert und sie hat einwandfrei funktioniert. Ich weiß, was Sie denken - warum haben Sie eine 13,8-MB-Assembly - sie ist Teil meiner Datenschicht, die mit einer NetTeirs-Vorlage generiert wurde. Wir haben viele Tische.
Legasthenikeraboko
1
@dyslexicanaboko: Nun, wenn Sie viele Typen haben, wird es lange dauern, sie alle aufzuzählen. Wie viele Arten sind in der Assembly obwohl? Und was machst du mit ihnen? (Sind Sie sicher, dass das Problem darin besteht, die Typen zu extrahieren, oder nur, was Sie danach tun?)
Jon Skeet
Ich komme nicht an dem Aufruf von asm.GetTypes () vorbei, er hängt nur - ich meine, es ist offensichtlich die Tatsache, dass es viele Typen gibt - ich kann nichts tun, weil es sich darum bemüht, sie alle zu bekommen . Meine CPU schießt auf einem meiner 4 Kerne zu 30%. Ich meine wirklich, ich frage mich nur, ob es eine Möglichkeit gibt zu sagen: "Hey - schau nur in DIESEN Namespace" - ich habe den Eindruck, dass dies nicht möglich ist, weil die GetTypes () -Methode nur einen leeren Konstruktor hat. Ich versuche, eine Art Objektbrowser zu erstellen.
Legasthenikeraboko
1
Guter Punkt, das habe ich noch nicht versucht. Im Moment arbeite ich nur daran, die Klassen direkt mit asm.GetType (fullQualifiedClassName) auszurichten - das funktioniert, aber es ist nicht möglich, dem Benutzer eine Liste von Klassen anzuzeigen, was ich wollte. Dies ist übrigens kein Client, ich verwende es intern für mich und andere Entwickler.
Legasthenikeraboko
1
@DebugErr: Ja - es ist einfach genug, es nur zu Klassen zu machen, wenn Sie wollen, aber ich vermute, dass das OP wahrscheinlich wirklich alle Typen wollte.
Jon Skeet
101

Ich möchte nur zu Jons Beispiel hinzufügen. Um einen Verweis auf Ihre eigene Baugruppe zu erhalten, können Sie Folgendes verwenden:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection Namespace.

Wenn Sie eine Baugruppe untersuchen möchten, auf die Sie keinen Verweis haben, können Sie eine der folgenden Methoden verwenden:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Wenn Sie beabsichtigen, Ihren Typ zu instanziieren, sobald Sie ihn gefunden haben:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

Weitere Informationen finden Sie in der Dokumentation zur Assembly-Klasse .

Sobald Sie den Verweis auf das AssemblyObjekt haben, können Sie assembly.GetTypes()wie Jon bereits demonstriert verwenden.

Thorarin
quelle
Wie kann ich auf eine völlig andere Baugruppe verweisen, die sich in meiner Lösung befindet?
Alex
13
Am einfachsten ist es, typeofeinen Typ zu verwenden, von dem Sie wissen, dass er sich in dieser Assembly befindet, und dann die AssemblyEigenschaft, wie in meinem Beispiel.
Jon Skeet
2
Wenn Sie auf eine Assembly verweisen möchten, z. B. abc.dll, die in Ihrer Lösung enthalten ist, und wenn Sie in Ordnung sind, den DLL-Namen fest zu codieren, können Sie auch auf die Assembly verweisen: `Assembly Assembly = Assembly.Load (" abc ");`
Kash
Es wird nur die aktuelle Baugruppe geladen. Ich habe eine Anwendung oder Exe mit 4 DLLs oder Projekten. Wie kann ich Namen der Klassen dieser DLLs erhalten?
Er Mayank
@ JonSkeet Wie wäre dies in einer "modernen" c # -Umgebung erreichbar? Zum Beispiel bei der UWP-Entwicklung. UWP verfügt nicht über die GetExecutingAssembly () -Methode.
Daniel Armstrong