Czy jest coś takiego:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
więc zamiast przechodzić przez pętlę AppDomain.CurrentDomain.GetAssemblies()
, moglibyśmy bezpośrednio pobrać konkretny zestaw.
Odpowiedzi:
Rozwiązałem z LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
To zależy od tego, co próbujesz osiągnąć.
Jeśli chcesz tylko zdobyć zestaw, powinieneś zadzwonić System.Reflection.Assembly.Load()
(jak już wskazano). Dzieje się tak, ponieważ .NET automatycznie sprawdza, czy zestaw został już załadowany do bieżącej domeny AppDomain i nie ładuje go ponownie, jeśli był.
Jeśli próbujesz tylko sprawdzić, czy zestaw został załadowany, czy nie (być może z jakiegoś powodu diagnostycznego), musisz wykonać pętlę przez wszystkie załadowane zestawy.
Innym powodem, dla którego możesz chcieć zapętlić, jest znajomość tylko niektórych informacji o asemblerze (np. Nie jesteś pewien wersji). Oznacza to, że wiesz wystarczająco dużo, aby „rozpoznać go, gdy go zobaczysz”, ale nie wystarczająco, aby go załadować. Jest to jednak dość niejasny i mało prawdopodobny scenariusz.
Dla tych, którzy potrzebują tylko dostępu do metadanych zestawu (wersji itp.), Wypróbuj Assembly.ReflectionOnlyLoad (name), który jest w stanie załadować tylko metadane, prawdopodobnie oszczędzając w pamięci i we / wy.
Jeśli jest to zestaw, do którego odwołujesz się, lubię pisać klasę podobną do poniższej:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
a potem zawsze, gdy potrzebujesz odniesienia do tego zestawu:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
Możesz napisać metodę rozszerzenia, która zrobi to, czego potrzebujesz.
Ta metoda wyliczy tylko załadowane zestawy , jeśli prawdopodobnie musisz je załadować, użyj Assembly.Load
z zaakceptowanej odpowiedzi.
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
Następnie wywołujesz tę metodę na AppDomain w następujący sposób:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
Jeśli SomeAssembly zostanie załadowana do bieżącej AppDomain, metoda zwróci ją, w przeciwnym razie zwróci null
.
Przyjrzyj się klasie System.Reflection.Assembly, w szczególności metodzie Load: MSDN
System.IO.FileNotFoundException
gdyby nie można było załadować zestawu.