Come ottenere C # .Net Assembly per nome?


90

C'è qualcosa come:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

quindi, invece di scorrere AppDomain.CurrentDomain.GetAssemblies(), potremmo semplicemente ottenere direttamente l'assembly specifico.

Risposte:



74

Ho risolto con LINQ

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

8
Questo funzionerà solo se l'assieme in questione è caricato. Potrebbe non essere d'aiuto quando si registrano tipi in un DAL da un'API Web
Chazt3n

17

Dipende da cosa stai cercando di ottenere.

Se vuoi solo ottenere l'assembly, dovresti chiamare System.Reflection.Assembly.Load()(come già sottolineato). Questo perché .NET controlla automaticamente se l'assembly è già stato caricato nell'AppDomain corrente e non lo carica di nuovo se lo è stato.

Se stai solo cercando di verificare se l'assembly è stato caricato o meno (per qualche motivo diagnostico, forse), devi eseguire il ciclo su tutti gli assembly caricati.

Un altro motivo per cui potresti voler eseguire il ciclo è se conosci solo alcune delle informazioni sull'assembly (es. Non sei sicuro della versione). Cioè, ne sai abbastanza per "riconoscerlo quando lo vedi", ma non abbastanza per caricarlo. Questo è uno scenario abbastanza oscuro e improbabile, però.


System.Reflection.Assembly.Load () è perfetto quanto quello di cui ho bisogno.
Jronny


7

Se questo è un assembly a cui hai fatto riferimento, mi piace scrivere una classe come la seguente:

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

e poi ogni volta che hai bisogno di un riferimento a quell'assembly:

var assembly = MyLibraryAssembly.Value;

Questa è una soluzione molto pulita che ho sempre cercato! Posso usarlo in questo modo:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

Puoi scrivere un metodo di estensione che faccia ciò di cui hai bisogno.

Questo metodo enumererà solo gli assembly caricati , se è necessario caricarlo, usalo Assembly.Loaddalla risposta accettata.

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

Quindi chiami questo metodo su un AppDomain come questo:

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

Se SomeAssembly viene caricato nell'AppDomain corrente, il metodo lo restituirà, altrimenti tornerà null.


Non ho trovato GetAssemblyByName ()
Ziggler

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.