Чи є щось на зразок:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
отже, замість перегляду AppDomain.CurrentDomain.GetAssemblies(), ми могли б просто отримати конкретну збірку безпосередньо.
Відповіді:
Я вирішив з LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Це залежить від того, що ви намагаєтесь досягти.
Якщо ви просто хочете отримати збірку, то вам слід зателефонувати System.Reflection.Assembly.Load()(як уже зазначалося). Це тому, що .NET автоматично перевіряє, чи збірка вже завантажена в поточний AppDomain, і не завантажує її знову, якщо вона була.
Якщо ви просто намагаєтеся перевірити, чи збірка завантажена чи ні (можливо, з якихось причин діагностики), вам доведеться прокрутити всі завантажені збірки.
Ще однією причиною, яку вам може знадобитися цикл, є те, що ви знаєте лише деяку інформацію про збірку (наприклад, ви не впевнені у версії). Тобто ви знаєте достатньо, щоб «розпізнати, коли побачите», але недостатньо, щоб завантажити. Однак це досить незрозумілий і малоймовірний сценарій.
Для тих, кому просто потрібен доступ до метаданих збірки (версія тощо), перевірте Assembly.ReflectionOnlyLoad (ім'я), який може завантажувати лише метадані, можливо, заощаджуючи пам'ять та введення-виведення.
Якщо це збірка, на яку ви посилалися, мені подобається писати клас, такий:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
а потім, коли вам потрібно посилання на цю збірку:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
Ви можете написати метод розширення, який робить те, що вам потрібно.
Цей метод буде перераховувати лише завантажені збірки , якщо вам потрібно завантажити його, використовуйте 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.
Погляньте на клас System.Reflection.Assembly, зокрема метод Load: MSDN
System.IO.FileNotFoundExceptionчи не вдалося завантажити збірку.