Як отримати C # .Net Assembly за назвою?


89

Чи є щось на зразок:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

отже, замість перегляду AppDomain.CurrentDomain.GetAssemblies(), ми могли б просто отримати конкретну збірку безпосередньо.

Відповіді:



72

Я вирішив з LINQ

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

7
Це буде працювати лише в тому випадку, якщо відповідний збір завантажений. Може не допомогти при реєстрації типів у DAL із веб-API
Chazt3n

17

Це залежить від того, що ви намагаєтесь досягти.

Якщо ви просто хочете отримати збірку, то вам слід зателефонувати System.Reflection.Assembly.Load()(як уже зазначалося). Це тому, що .NET автоматично перевіряє, чи збірка вже завантажена в поточний AppDomain, і не завантажує її знову, якщо вона була.

Якщо ви просто намагаєтеся перевірити, чи збірка завантажена чи ні (можливо, з якихось причин діагностики), вам доведеться прокрутити всі завантажені збірки.

Ще однією причиною, яку вам може знадобитися цикл, є те, що ви знаєте лише деяку інформацію про збірку (наприклад, ви не впевнені у версії). Тобто ви знаєте достатньо, щоб «розпізнати, коли побачите», але недостатньо, щоб завантажити. Однак це досить незрозумілий і малоймовірний сценарій.


System.Reflection.Assembly.Load () настільки ж досконалий, як і те, що мені потрібно.
Jronny

9

Для тих, кому просто потрібен доступ до метаданих збірки (версія тощо), перевірте Assembly.ReflectionOnlyLoad (ім'я), який може завантажувати лише метадані, можливо, заощаджуючи пам'ять та введення-виведення.


2
@ erik-reppen: Відповідно до документів MS це доступно в попередніх версіях. Я використовую його в додатку 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim,

7

Якщо це збірка, на яку ви посилалися, мені подобається писати клас, такий:

namespace MyLibrary {
   public static class MyLibraryAssembly {
      public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
   }
}

а потім, коли вам потрібно посилання на цю збірку:

var assembly = MyLibraryAssembly.Value;

Це дуже чисте рішення, яке я завжди шукав! Я можу використовувати це так:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Аліельсон Піффер

3

Ви можете написати метод розширення, який робить те, що вам потрібно.

Цей метод буде перераховувати лише завантажені збірки , якщо вам потрібно завантажити його, використовуйте Assembly.Loadз прийнятої відповіді.

public static class AppDomainExtensions
{
    public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
    {
        return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
    }
}

Потім ви викликаєте цей метод на AppDomain таким чином:

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

Якщо SomeAssembly завантажено в поточний AppDomain, метод поверне його, інакше він повернеться null.


Я didnot знайти GetAssemblyByName ()
Ziggler

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.