Comment obtenir l'assembly C # .Net par nom?

89

Y a-t-il quelque chose comme:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

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

Jronny
la source

Réponses:

105

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

cyberzed
la source
6
Pour ceux qui se demandent, cela jette System.IO.FileNotFoundExceptionsi l'assemblage n'a pas pu être chargé.
Rudey
72

J'ai résolu avec LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Fabio
la source
7
Cela ne fonctionnera que si l'assemblage en question est chargé. Peut ne pas aider lors de l'enregistrement de types dans une DAL à partir d'une API Web
Chazt3n
17

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

Si vous souhaitez simplement obtenir l'assembly, vous devez appeler System.Reflection.Assembly.Load()(comme déjà indiqué). C'est parce que .NET vérifie automatiquement si l'assembly a déjà été chargé dans l'AppDomain actuel et ne le charge pas à nouveau s'il l'a été.

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

Une autre raison pour laquelle vous voudrez peut-être boucler est si vous ne connaissez que certaines des informations d'assemblage (par exemple, vous n'êtes pas sûr de la version). Autrement dit, 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.

EMP
la source
System.Reflection.Assembly.Load () est tout aussi parfait que ce dont j'ai besoin.
Jronny
9

Pour ceux qui ont juste besoin d'accéder aux métadonnées de l'assembly (version, etc.), consultez Assembly.ReflectionOnlyLoad (nom), qui est capable de charger uniquement les métadonnées, économisant éventuellement de la mémoire et des E / S.

Mathieu Frenette
la source
2
@ erik-reppen: selon les documents MS, il est disponible dans les versions précédentes. Je l'utilise dans une application 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim
6

S'il s'agit d'un assembly que vous avez référencé, j'aime écrire une classe comme celle-ci:

namespace MyLibrary {
   public static class MyLibraryAssembly {
      public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
   }
}

puis chaque fois que vous avez besoin d'une référence à cet assembly:

var assembly = MyLibraryAssembly.Value;
Dave Cousineau
la source
C'est une solution très propre que j'ai toujours recherchée! Je peux l'utiliser comme ceci:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer
3

Vous pouvez écrire une méthode d'extension qui fait ce dont vous avez besoin.

Cette méthode énumérera uniquement les assemblys chargés , si vous devez le charger, utilisez-la à Assembly.Loadpartir de la réponse acceptée.

public static class AppDomainExtensions
{
    public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
    {
        return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
    }
}

Ensuite, vous appelez cette méthode sur un AppDomain comme ceci:

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

Si SomeAssembly est chargé dans le AppDomain actuel, la méthode le renverra, sinon il reviendra null.

Marcell Toth
la source
Je n'ai pas trouvé GetAssemblyByName ()
Ziggler le
2

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

Maximilian Mayerl
la source