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.

Odpowiedzi:



72

Rozwiązałem z LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}

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.


System.Reflection.Assembly.Load () jest tak samo doskonały, jak to, czego potrzebuję.
Jronny


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;

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.


Nie znalazłem GetAssemblyByName ()
Ziggler

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.