Comment obtenir tous les types dans un assembly référencé?
Pour quelque raison que ce soit, je n'arrive pas à obtenir la liste des types dans un assemblage. Non seulement cela, je ne peux même pas semblent être en mesure d'obtenir à cet assembly référencé.
J'ai essayé AppDomain.CurrentDomain.GetAssemblies()
, mais il ne retourne que des assemblées qui ont déjà été chargées dans la mémoire.
J'ai essayé Assembly.GetExecutingAssembly().GetReferencedAssemblies()
, mais cela renvoie mscorlib.
Ce qui me manque?
- Êtes-vous essayer d'inspecter un assembly référencé par le projet, ou de celui qui est assis sur le système de fichiers quelque part?
- Je soupçonne que le CLR de la mise en œuvre, il serait impossible d'obtenir tous les types de toutes les assemblées, car ils doivent être juste-à-temps compilé à un importun temps, mais je suis vraiment pas spécialiste, donc vous devez utiliser uniquement mon commentaire comme un indice pour la poursuite de l'exploration.
- Assembly référencé
- Mon code est une marque nouvelle Console de projet, où j'ai référencé une assemblée que je veux pour l'inspecter. C'est tout.
Vous devez vous connecter pour publier un commentaire.
Noter que
Assembly.GetReferencedAssemblies
inclut uniquement un assemblage particulier si vous utilisez un type dans cette assemblée, votre assemblée (ou d'un type que vous utilisez dépend du type de cette assemblée). Il ne suffit pas de se limiter à une assemblée dans la liste des références dans Visual Studio. Peut-être ce qui explique la différence en sortie de ce que vous attendez? Je note que si vous craignez d'être en mesure d'obtenir toutes les assemblées qui sont dans la liste de références dans Visual Studio à l'aide de la réflexion qui est impossible; les métadonnées de l'assemblée ne comprennent pas toutes les informations sur les assemblages sur lequel le montage n'est pas tributaire.Cela dit, une fois que vous avez récupéré une liste de tous les assemblys référencés quelque chose comme ce qui suit devrait vous permettre de les énumérer sur tous les types de ces assemblées:
Si vous avez besoin d'assemblées qui sont référencés dans Visual Studio, puis vous aurez à analyser les
csproj
fichier. Pour cela, découvrez leItemGroup
élément contenantReference
éléments.Enfin, si vous savez où une assemblée de vie, vous pouvez le charger à l'aide de
Assembly.LoadFile
et puis essentiellement procéder comme ci-dessus pour énumérer les types qui vivent dans cette chargée de l'assemblée.J'ai aussi atterri dans une situation où j'ai eu pour obtenir toutes les assemblées qui sont dans la liste de références dans Visual Studio.
J'ai utilisé à la suite d'un travail autour de l'obtenir.
La méthode GetReferencedAssemblies essentiellement d'optimiser le processus de découverte de votre assemblée, en sautant à ces assemblées que vous n'avez pas de référence explicite à votre assemblée.
Disons que vous avez un projet de a et B projet C projet référence B.
Maintenant, vous créez un nouveau projet, qui a une référence à C(pas de B)
Lorsque vous appelez
Assembly.Load("C path").GetReferenceAssemblies
il sera de retour juste à B si vous n'avez jamais fait une référence à une classe, enum, interface ... qui a été de la partie C de l'assemblée.Comme une solution de rechange, vous pouvez créer des mannequins, des instances de classes qui sont présents dans C.
Personnellement, j'ai utilisé cette solution dans le cas où vous avez besoin de séparer dans un projet de Base de toutes vos interfaces, et dans le Noyau.Proj1 pour marquer votre cours avec les interfaces utilisées dans de Base pour une découverte ultérieure de l'assemblée. Tenir à l'esprit que la réflexion a un impact sur la performance une fois le chargement de plusieurs assemblées, afin de ne pas finir avec une solution de faire une découverte sur un répertoire et le chargement de toutes assemblées pour obtenir les types dont vous avez besoin. Alors à partir de ce point, vous pouvez continuer avec le code @jason suggéré