Динамически загружаемые сборки. Класс 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); // вывести только имена методов
  }
}

Более подробные примеры программного кода об определении необходимой информации заданного типа описываются в теме:

 


Связанные темы