C#. Динамічно завантажувані збірки. Клас Assembly. Методи Load() та LoadFrom()




Динамічно завантажувані збірки. Клас Assembly. Методи Load() та LoadFrom()


Зміст


Пошук на інших ресурсах:

1. Яким чином можна підключити збірку до програми?

До програми зовнішню збірку можна підключити двома способами:

  • статичним шляхом з допомогою спеціальних засобів Microsoft Visual Studio. Це здійснюється, наприклад, командами “Add Reference…” або “Add Service Reference…”. У цьому випадку, у маніфесті збірки міститься відповідна інформація про зовнішню збірку, яка була підключена;
  • динамічно, з використанням засобів класу Assembly що розміщується в просторі імен System.Reflection. У цьому випадку, інформація про зовнішню збірку не міститься в маніфесті поточної збірки. Ця інформація отримується “на льоту”, тобто динамічно. Існує ряд задач, в яких інформація про збірку в програмі повинна отримуватись динамічно.

 

2. В чому полягає суть динамічного завантаження збірок у програмі?

Програма, яка розміщується в деякій збірці, може підключати інші збірки для того, щоб використовувати їх можливості (класи, інтерфейси, методи і т.д.). Динамічне завантаження збірки – це процес завантаження та отримання інформації про зовнішні збірки за вимогою по ходу виконання програми. При динамічному завантаженні зовнішньої збірки в маніфесті немає інформації про цю збірку. Інформація отримується програмно.

 

3. Призначення класу System.Assembly. Методи Load() та LoadFrom()

Клас System.Assembly містить засоби для динамічного завантаження збірок та перегляду їх властивостей. Клас System.Assembly розміщується в просторі імен System.Reflection. Для того, щоб використовувати засоби класу System.Assembly потрібно на початку модуля програми набрати такий код

using System.Reflection;

Щоб завантажити збірку, потрібно викликати один з методів:

  • метод Load() для приватних (private) збірок. Приватні збірки розміщуються в тому самому каталозі, що і програма, яка їх використовує (досліджує). У цьому випадку задається скорочене ім’я збірки;
  • метод LoadFrom() для розділюваних (shared) збірок. Розділювані збірки є бібліотеками, які можуть використовуватись різними додатками на одному й тому ж комп’ютері. Розділювані збірки розгортаються у спеціальному каталозі GAC (Global Assembly Cache).

 

4. Приклад динамічного завантаження та використання зовнішньої приватної (private) збірки. Метод Load()

У прикладі розглядаються деякі операції, що визначають інформацію про збірку mscorlib.dll. За даним зразком можна отримувати інформацію про власні розроблені збірки, які зберігаються у *.dll файлах.

Нижче приводиться текст методу GetAssemblyInfo(), який:

  • використовує метод Assembly.Load() для створення об’єкту, що містить інформацію про збірку mscorlib.dll;
  • в демонстраційних цілях отримує та виводить на екран усі типи, що є у збірці з допомогою методу GetTypes();
  • в демонстраційних цілях отримує інформацію про конкретний клас System.Math, який реалізовано у збірці mscorlib.dll.

Виводяться назви методів класу System.Math.

// метод, що демонструє отримання інформації зі збірки mscorlib.dll
static void GetAssemblyInfo()
{
  // взяти перелік імен типів збірки mscorlib.dll
  Assembly asm;
  asm = Assembly.Load("mscorlib.dll"); // замість цієї можна вказати власну збірку

  // взяти повне ім'я збірки
  string FullName = asm.FullName;
  // Full Name = mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089

  // взяти перелік імен у збірці
  Type[] types = asm.GetTypes(); // отримати усі типи, що є у збірці

  // вивести назви усіх типів збірки на екран
  foreach (Type t in types)
  {
    Console.WriteLine("Type: {0}", t.FullName);
  }

  // отримати інформацію про конкретний тип
  Type tp = asm.GetType("System.Math"); // тип System.Math
  MethodInfo[] methods = tp.GetMethods(); // отримати інформацію про методи System.Math

  // вивести перелік методів System.Math на екран
  foreach (MethodInfo mi in methods)
  {
    Console.WriteLine(mi.Name); // вивести тільки імена методів
  }
}

Більш детальні приклади програмного коду про визначення необхідної інформації заданого типу описуються в темі:

 


Зв’язані  теми