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.
c#
assemblies
Jronny
fuente
fuente
System.IO.FileNotFoundException
si no se pudo cargar el ensamblaje.Lo resolví con LINQ
Assembly GetAssemblyByName(string name) { return AppDomain.CurrentDomain.GetAssemblies(). SingleOrDefault(assembly => assembly.GetName().Name == name); }
fuente
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.
fuente
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.
fuente
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;
fuente
options.RegisterFromAssembly(Application.AssemblyReference.Value)
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.Load
la 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
.fuente
Eche un vistazo a la clase System.Reflection.Assembly, en particular al método Load: MSDN
fuente