Чи є щось на зразок:
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
чи не вдалося завантажити збірку.