web-dev-qa-db-fra.com

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

Y a-t-il quelque chose comme:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

donc au lieu de parcourir AppDomain.CurrentDomain.GetAssemblies(), nous pourrions simplement obtenir l'assembly spécifique directement.

77
Jronny

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

93
cyberzed

J'ai résolu avec LINQ

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

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

Si vous voulez simplement obtenir l'assembly, alors vous devez appeler System.Reflection.Assembly.Load() (comme déjà indiqué). En effet, .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 assemblages chargés.

Une autre raison pour laquelle vous voudrez peut-être effectuer une boucle est si vous ne connaissez que certaines informations sur l'assembly (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.

16
EMP

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 sur la mémoire et les entrées-sorties.

7
Mathieu Frenette

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

2
Maximilian Mayerl

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 avez besoin de le charger, utilisez Assembly.Load 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 renverra null.

0
Marcell Toth