Jak uzyskać zestaw C # .Net według nazwy?

89

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.

Jronny
źródło

Odpowiedzi:

105

Czy próbowałeś spojrzeć na Assembly.Load (...) ?

cyberzed
źródło
6
Dla tych, którzy się zastanawiają, to rzuca, System.IO.FileNotFoundExceptiongdyby nie można było załadować zestawu.
Rudey
72

Rozwiązałem z LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Fabio
źródło
7
Działa to tylko wtedy, gdy dany zestaw jest załadowany. Może nie pomóc podczas rejestrowania typów w DAL z internetowego interfejsu API
Chazt3n
17

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.

EMP
źródło
System.Reflection.Assembly.Load () jest tak samo doskonały, jak to, czego potrzebuję.
Jronny
9

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.

Mathieu Frenette
źródło
2
@ erik-reppen: Zgodnie z dokumentacją MS jest dostępny w poprzednich wersjach. Używam go w aplikacji 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim
6

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;
Dave Cousineau
źródło
To bardzo czyste rozwiązanie, którego zawsze szukałem! Mogę to wykorzystać w ten sposób:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer
3

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.Loadz 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.

Marcell Toth
źródło
Nie znalazłem GetAssemblyByName ()
Ziggler
2

Przyjrzyj się klasie System.Reflection.Assembly, w szczególności metodzie Load: MSDN

Maximilian Mayerl
źródło