¿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.

Respuestas:



72

Lo resolví con LINQ

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

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.


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


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;

¡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.


No encontré GetAssemblyByName ()
Ziggler

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.