2009-08-22 6 views
75

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

Alle Hinweise oder Beispielcode, wie Sie dies tun? Betrachtung?

+0

Wenn Sie eine Baugruppe untersuchen möchten, auf die von Ihrem Projekt nicht verwiesen wird, finden Sie in meiner aktualisierten Antwort. – Thorarin

Antwort

115

Verwenden Sie Assembly.GetTypes. Zum Beispiel:

Assembly mscorlib = typeof(string).Assembly; 
foreach (Type type in mscorlib.GetTypes()) 
{ 
    Console.WriteLine(type.FullName); 
} 
+1

Irgendwelche Vorschläge für große Baugruppen? Wenn ich diesen Code für eine 13,8 MB Assembly ausführe, hängt meine VS-Instanz für das, was sich unendlich anfühlt. Ich probierte eine kleine 9 KB-Assembly und es funktionierte gut. Ich weiß, was Sie denken - warum haben Sie eine 13,8 MB Assembly - es ist Teil meiner Datenschicht, die mit einer NetTeirs Vorlage generiert wurde. Wir haben viele Tische. – dyslexicanaboko

+1

@dyslexicanaboko: Nun, wenn Sie viele Arten haben, wird es eine lange Zeit dauern, sie alle aufzuzählen. Wie viele Typen * sind * in Ihrer Baugruppe? Und was machst du mit ihnen? (Sind Sie sicher, dass das Problem darin besteht, die Typen zu extrahieren, oder was tun Sie danach?) –

+0

Ich kann den asm.GetTypes() -Aufruf nicht erreichen, es hängt einfach - ich meine, es ist offensichtlich die Tatsache, dass es da ist Es gibt eine Menge Typen - ich kann nichts tun, weil es darauf hinausläuft, sie alle zu bekommen. Meine CPU schießt 30% auf einen meiner 4 Kerne. Ich meine wirklich, ich frage mich nur, ob es eine Möglichkeit gibt zu sagen "Hey - schau nur in diesem Namespace" - ich habe den Eindruck, dass es nicht möglich ist, weil die GetTypes() Methode nur einen leeren Konstruktor hat. Ich versuche, einen Objektbrowser von Art zu machen. – dyslexicanaboko

76

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

Assembly myAssembly = Assembly.GetExecutingAssembly(); 

System.Reflection Namespace.

Wenn Sie eine Assembly untersuchen möchten, dass Sie keinen Bezug haben, können Sie entweder von diesen verwenden:

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

Wenn Sie Ihre Art instanziiert, sobald Sie haben es gefunden:

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

Weitere Informationen finden Sie unter Assembly class documentation. Wenn Sie den Verweis auf das Objekt Assembly haben, können Sie assembly.GetTypes() wie Jon bereits demonstriert haben.

+0

Wie könnte ich eine komplett andere Assembly verweisen, die in meiner Lösung ist? – Alex

+11

Der einfachste Weg ist, 'typeof' mit einem Typ zu verwenden, von dem Sie wissen, dass er sich in dieser Baugruppe befindet, und dann die' Assembly'-Eigenschaft, wie in meinem Beispiel. –

+2

Wenn Sie eine Assembly referenzieren möchten, sagen Sie abc.dll, das ist in Ihrer Lösung, und wenn Sie den DLL-Namen korrekt codieren, ist ein weiterer Ansatz, die Assembly zu referenzieren: 'Assembly assembly = Assembly.Load (" abc "); ' – Kash