C'è qualcosa come:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
quindi, invece di scorrere AppDomain.CurrentDomain.GetAssemblies()
, potremmo semplicemente ottenere direttamente l'assembly specifico.
Risposte:
Ho risolto con LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Dipende da cosa stai cercando di ottenere.
Se vuoi solo ottenere l'assembly, dovresti chiamare System.Reflection.Assembly.Load()
(come già sottolineato). Questo perché .NET controlla automaticamente se l'assembly è già stato caricato nell'AppDomain corrente e non lo carica di nuovo se lo è stato.
Se stai solo cercando di verificare se l'assembly è stato caricato o meno (per qualche motivo diagnostico, forse), devi eseguire il ciclo su tutti gli assembly caricati.
Un altro motivo per cui potresti voler eseguire il ciclo è se conosci solo alcune delle informazioni sull'assembly (es. Non sei sicuro della versione). Cioè, ne sai abbastanza per "riconoscerlo quando lo vedi", ma non abbastanza per caricarlo. Questo è uno scenario abbastanza oscuro e improbabile, però.
Per coloro che hanno solo bisogno di accedere ai metadati dell'assembly (versione, ecc.), Controlla Assembly.ReflectionOnlyLoad (nome), che è in grado di caricare solo i metadati, eventualmente salvando su memoria e IO.
Se questo è un assembly a cui hai fatto riferimento, mi piace scrivere una classe come la seguente:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
e poi ogni volta che hai bisogno di un riferimento a quell'assembly:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
Puoi scrivere un metodo di estensione che faccia ciò di cui hai bisogno.
Questo metodo enumererà solo gli assembly caricati , se è necessario caricarlo, usalo Assembly.Load
dalla risposta accettata.
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
Quindi chiami questo metodo su un AppDomain come questo:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
Se SomeAssembly viene caricato nell'AppDomain corrente, il metodo lo restituirà, altrimenti tornerà null
.
Dai un'occhiata alla classe System.Reflection.Assembly, in particolare al metodo Load: MSDN
System.IO.FileNotFoundException
se l'assieme non può essere caricato.