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