C #: liste toutes les classes dans l'assembly


103

Je voudrais sortir (par programme - C #) une liste de toutes les classes de mon assembly.

Des conseils ou un exemple de code comment faire cela? Réflexion?


Si votre intention est d'examiner un assembly qui n'est pas référencé par votre projet, consultez ma réponse mise à jour.
Thorarin

Réponses:


152

Utilisez Assembly.GetTypes. Par exemple:

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

1
Des suggestions pour les grands assemblages? Lorsque j'exécute ce code pour un assemblage de 13,8 Mo, mon instance VS se bloque pour ce qui semble indéfiniment. J'ai essayé un petit assemblage de 9 Ko et cela a très bien fonctionné. Je sais ce que vous pensez - pourquoi avez-vous un assemblage de 13,8 Mo - il fait partie de ma couche de données générée à l'aide d'un modèle NetTeirs. Nous avons de nombreuses tables.
dyslexicanaboko

1
@dyslexicanaboko: Eh bien, si vous avez beaucoup de types, il vous faudra beaucoup de temps pour tous les énumérer. Combien de types y a-t-il dans votre assemblage? Et que faites-vous avec eux? (Êtes-vous sûr que le problème réside dans l'extraction des types, ou juste ce que vous faites après?)
Jon Skeet

Je ne peux pas passer l'appel asm.GetTypes (), il se bloque juste - je veux dire que c'est évidemment le fait qu'il y a beaucoup de types - je ne peux rien faire parce que cela cherche à les obtenir tous . Mon CPU tire à 30% sur l'un de mes 4 cœurs. Je veux dire en fait, je me demande simplement s'il y a un moyen de dire: "Hé - ne regarde que dans CET espace de noms" - j'ai l'impression que ce n'est pas possible parce que la méthode GetTypes () n'a qu'un constructeur vide. J'essaie de créer une sorte de navigateur d'objets.
dyslexicanaboko

1
Bon point, je n'ai pas encore essayé ça. Mon travail pour le moment consiste simplement à cibler les classes directement en utilisant asm.GetType (FullyQualifiedClassName) - cela fonctionne, mais montrer une liste de classes à l'utilisateur n'est pas possible, ce que je voulais. Ce n'est pas face au client, je l'utilise en interne pour moi-même et d'autres développeurs.
dyslexicanaboko

1
@DebugErr: Oui - c'est assez facile de ne faire que des classes si vous voulez, mais je suppose que l'OP voulait probablement vraiment tous les types.
Jon Skeet

102

Je voudrais juste ajouter à l'exemple de Jon. Pour obtenir une référence à votre propre assemblage, vous pouvez utiliser:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection espace de noms.

Si vous souhaitez examiner un assembly auquel vous n'avez aucune référence, vous pouvez utiliser l'un de ces éléments:

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

Si vous avez l'intention d'instancier votre type une fois que vous l'avez trouvé:

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

Consultez la documentation de la classe Assembly pour plus d'informations.

Une fois que vous avez la référence à l' Assemblyobjet, vous pouvez utiliser assembly.GetTypes()comme Jon déjà démontré.


Comment référencer un assemblage complètement différent qui se trouve dans ma solution?
Alex

13
Le moyen le plus simple consiste à utiliser typeofun type dont vous savez qu'il est dans cet assembly, puis la Assemblypropriété, comme dans mon exemple.
Jon Skeet

2
Si vous voulez référencer un assembly, disons abc.dll, qui est dans votre solution et si vous êtes ok coder en dur le nom de la dll, une autre approche pour référencer l'assembly est: `Assembly assembly = Assembly.Load (" abc ");`
Kash

Il ne charge que l'assemblage actuel. J'ai une application ou un exe utilisant 4 dll ou projets. Comment puis-je obtenir les noms des classes de ces dll?
Er Mayank

@JonSkeet Comment cela serait-il réalisable dans un environnement c # «moderne»? Comme lors du développement UWP. UWP n'a pas la méthode GetExecutingAssembly ().
Daniel Armstrong
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.