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.
c#
assemblies
Jronny
źródło
źródło
System.IO.FileNotFoundException
gdyby nie można było załadować zestawu.Rozwiązałem z LINQ
Assembly GetAssemblyByName(string name) { return AppDomain.CurrentDomain.GetAssemblies(). SingleOrDefault(assembly => assembly.GetName().Name == name); }
źródło
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.
źródło
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.
źródło
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;
źródło
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
.źródło
Przyjrzyj się klasie System.Reflection.Assembly, w szczególności metodzie Load: MSDN
źródło