Existe algo como:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
então, em vez de fazer um loop AppDomain.CurrentDomain.GetAssemblies()
, poderíamos apenas obter o assembly específico diretamente.
Respostas:
Resolvi com LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Depende do que você está tentando realizar.
Se você deseja apenas obter o assembly, deve chamar System.Reflection.Assembly.Load()
(como já apontado). Isso ocorre porque o .NET verifica automaticamente se o assembly já foi carregado no AppDomain atual e não o carrega novamente se tiver sido.
Se você está apenas tentando verificar se o assembly foi carregado ou não (por algum motivo de diagnóstico, talvez), você precisa fazer um loop em todos os assemblies carregados.
Outro motivo pelo qual você pode querer fazer um loop é se você conhece apenas algumas das informações do assembly (por exemplo, não tem certeza da versão). Ou seja, você sabe o suficiente para "reconhecê-lo quando vê", mas não o suficiente para carregá-lo. Esse é um cenário bastante obscuro e improvável, no entanto.
Para quem precisa apenas acessar os metadados do assembly (versão, etc.) verifique o Assembly.ReflectionOnlyLoad (nome), que é capaz de carregar apenas os metadados, possivelmente economizando na memória e no IO.
Se esta é uma montagem que você referenciou, eu gosto de escrever uma classe como a seguinte:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
e então sempre que você precisar de uma referência a esse assembly:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
Você pode escrever um método de extensão que faça o que você precisa.
Este método enumera apenas assemblies carregados , se você possivelmente precisar carregá-lo, use a Assembly.Load
partir da resposta aceita.
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
Então você chama este método em um AppDomain assim:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
Se SomeAssembly for carregado no AppDomain atual, o método o retornará, caso contrário, ele retornará null
.
Dê uma olhada na classe System.Reflection.Assembly, em particular no método Load: MSDN
System.IO.FileNotFoundException
se a montagem não pôde ser carregada.