Gibt es so etwas wie:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
also anstatt durchzuschleifen AppDomain.CurrentDomain.GetAssemblies()
, könnten wir einfach die spezifische Baugruppe direkt erhalten.
Antworten:
Es hängt davon ab, was Sie erreichen wollen.
Wenn Sie nur die Baugruppe erhalten möchten, sollten Sie anrufen System.Reflection.Assembly.Load()
(wie bereits erwähnt). Dies liegt daran, dass .NET automatisch überprüft, ob die Assembly bereits in die aktuelle AppDomain geladen wurde, und sie dann nicht erneut lädt, wenn dies der Fall war.
Wenn Sie nur versuchen zu überprüfen, ob die Baugruppe geladen wurde oder nicht (möglicherweise aus diagnostischen Gründen), müssen Sie alle geladenen Baugruppen durchlaufen.
Ein weiterer Grund, warum Sie eine Schleife durchführen möchten, besteht darin, dass Sie nur einige der Assembly-Informationen kennen (z. B. sind Sie sich der Version nicht sicher). Das heißt, Sie wissen genug, um "es zu erkennen, wenn Sie es sehen", aber nicht genug, um es zu laden. Das ist jedoch ein ziemlich dunkles und unwahrscheinliches Szenario.
Für diejenigen, die nur auf die Metadaten (Version usw.) der Assembly zugreifen müssen, lesen Sie Assembly.ReflectionOnlyLoad (Name), mit dem nur die Metadaten geladen werden können, wodurch möglicherweise Speicher und E / A eingespart werden.
Wenn dies eine Assembly ist, auf die Sie verwiesen haben, schreibe ich gerne eine Klasse wie die folgende:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
und wann immer Sie einen Verweis auf diese Baugruppe benötigen:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
Sie können eine Erweiterungsmethode schreiben, die genau das tut, was Sie benötigen.
Diese Methode listet geladene Assemblys nur auf . Wenn Sie sie möglicherweise laden müssen, verwenden Sie sie Assembly.Load
aus der akzeptierten Antwort.
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
Dann rufen Sie diese Methode in einer AppDomain wie folgt auf:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
Wenn SomeAssembly in die aktuelle AppDomain geladen wird, gibt die Methode diese zurück, andernfalls wird sie zurückgegeben null
.
Schauen Sie sich die System.Reflection.Assembly-Klasse an, insbesondere die Load-Methode: MSDN
System.IO.FileNotFoundException
wenn die Baugruppe nicht geladen werden konnte.