¿Cómo obtener C # .Net Assembly por nombre?

89

Hay algo como:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

así que en lugar de recorrer en bucle AppDomain.CurrentDomain.GetAssemblies(), podríamos obtener el ensamblado específico directamente.

Jronny
fuente

Respuestas:

105

¿Ha intentado mirar Assembly.Load (...) ?

cyberzed
fuente
6
Para los que se preguntan, esto arroja System.IO.FileNotFoundExceptionsi no se pudo cargar el ensamblaje.
Rudey
72

Lo resolví con LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Fabio
fuente
7
Esto solo funcionará si se carga el ensamblaje en cuestión. Puede que no ayude al registrar tipos en un DAL desde una API web
Chazt3n
17

Depende de lo que intente lograr.

Si solo desea obtener el ensamblaje, debe llamar System.Reflection.Assembly.Load()(como ya se señaló). Esto se debe a que .NET comprueba automáticamente si el ensamblado ya se ha cargado en el AppDomain actual y no lo vuelve a cargar si se ha cargado.

Si solo está tratando de verificar si el ensamblaje se ha cargado o no (por alguna razón de diagnóstico, quizás), entonces debe recorrer todos los ensamblajes cargados.

Otra razón por la que podría querer hacer un bucle es si solo conoce parte de la información del ensamblaje (por ejemplo, no está seguro de la versión). Es decir, sabe lo suficiente para "reconocerlo cuando lo vea", pero no lo suficiente para cargarlo. Sin embargo, ese es un escenario bastante oscuro e improbable.

EMP
fuente
System.Reflection.Assembly.Load () es tan perfecto como lo que necesito.
Jronny
9

Para aquellos que solo necesitan acceder a los metadatos del ensamblado (versión, etc.), consulte Assembly.ReflectionOnlyLoad (nombre), que puede cargar solo los metadatos, posiblemente ahorrando en memoria e IO.

Mathieu Frenette
fuente
2
@ erik-reppen: Según MS docs, está disponible en versiones anteriores. Lo estoy usando en una aplicación 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim
6

Si este es un ensamblado al que ha hecho referencia, me gusta escribir una clase como la siguiente:

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

y luego, siempre que necesite una referencia a ese ensamblaje:

var assembly = MyLibraryAssembly.Value;
Dave Cousineau
fuente
¡Esta es una solución muy limpia que siempre he estado buscando! Puedo usarlo así:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer
3

Puede escribir un método de extensión que haga lo que necesite.

Este método solo enumerará los ensamblados cargados , si es posible que necesite cargarlo, use Assembly.Loadla respuesta aceptada.

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

Luego llamas a este método en un AppDomain como este:

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

Si SomeAssembly se carga en el AppDomain actual, el método lo devolverá; de lo contrario, lo devolverá null.

Marcell Toth
fuente
No encontré GetAssemblyByName ()
Ziggler
2

Eche un vistazo a la clase System.Reflection.Assembly, en particular al método Load: MSDN

Maximilian Mayerl
fuente