100 votes

Comment obtenir l'Assemblée C#.Net par son nom ?

Y a-t-il quelque chose comme :

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

Ainsi, au lieu de passer en boucle par AppDomain.CurrentDomain.GetAssemblies() nous pourrions simplement obtenir l'assemblage spécifique directement.

115voto

cyberzed Points 1125

Avez-vous essayé de regarder Assembly.Load(...) ?

7 votes

Pour ceux qui se posent la question, cela jette System.IO.FileNotFoundException si l'assemblage n'a pas pu être chargé.

81voto

Fabio Points 46

J'ai résolu avec LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}

8 votes

Cela ne fonctionnera que si l'assemblage en question est chargé. Peut ne pas être utile lors de l'enregistrement de types dans un DAL à partir d'une API Web.

19voto

EMP Points 17246

Cela dépend de ce que vous essayez d'accomplir.

Si vous voulez juste obtenir l'assemblage, alors vous devez appeler System.Reflection.Assembly.Load() (comme cela a déjà été souligné). C'est parce que .NET vérifie automatiquement si l'assemblage a déjà été chargé dans l'AppDomain actuel et ne le charge pas à nouveau si c'est le cas.

Si vous essayez juste de vérifier si l'assemblage a été chargé ou non (pour une raison de diagnostic, peut-être), alors vous devez boucler sur tous les assemblages chargés.

Une autre raison pour laquelle vous pourriez vouloir faire une boucle est que vous ne connaissez qu'une partie des informations de l'assemblage (par exemple, vous n'êtes pas sûr de la version). En d'autres termes, vous en savez assez pour "le reconnaître quand vous le voyez", mais pas assez pour le charger. C'est un scénario assez obscur et peu probable, cependant.

0 votes

System.Reflection.Assembly.Load() est tout aussi parfait que ce dont j'ai besoin.

9voto

Mathieu Frenette Points 160

Pour ceux qui n'ont besoin que d'accéder aux métadonnées de l'assemblage (version, etc.), consultez Assembly.ReflectionOnlyLoad(name), qui est capable de charger uniquement les métadonnées, ce qui permet d'économiser de la mémoire et des entrées-sorties.

2 votes

@erik-reppen : D'après les docs MS, il est disponible dans les versions précédentes. Je l'utilise dans une application 3.5 : msdn.microsoft.com/fr/us/library/0et80c7k(v=vs.100).aspx

2voto

Maximilian Mayerl Points 6335

Jetez un coup d'œil à la classe System.Reflection.Assembly, en particulier à la méthode Load : MSDN

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X