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.