Динамически загружаемые сборки

Рефлексия методов

Создание специальной программы для просмотра метаданных

Чтобы проиллюстрировать базовый процесс рефлексии (и оценить пользу от System. Type), создадим консольное приложение по имени MyTypeViewer. Это приложение будет отображать детали методов, свойств, полей и поддерживаемых интерфейсов (а также другие интересные элементы данных) для любого из типов, содержащихся как в самом приложении, так и в сборке mscorlib.dll (доступ к которой все приложения .NET получают автоматически). После создания соответствующего проекта первым делом необходимо импортировать пространство имен System.Reflection. Для выполнения рефлексии должно импортироваться это пространство имен.

using System.Reflection;

Далее потребуется модифицировать класс Program, определив в нем ряд статических методов так, чтобы каждый из них принимал единственный параметр System.Type и возвращал void. Сначала определим метод ListMethods (), который будет отображать имена методов, определенных в указанном типе.

Реализация метода ListFields () выглядит похоже. Единственным заметным отличием в ней является вызова Type.GetFieldsO и возврат в результате массива Fieldlnfo.

В предыдущей главе рассказывалось о том, что при поиске внешних сборок, на которые ссылается текущая сборка, CLR-среда заглядывает в манифест сборки. Во многих случаях необходимо, чтобы сборки могли загружаться на лету программно, даже если в манифесте о них не упоминается. Формально процесс загрузки внешних сборок по требованию называется динамической загрузкой. В пространстве имен System. Reflection поставляется класс по имени Assembly, с применением которого можно динамически загружать сборку, а также просматривать ее собственные свойства. Этот класс позволяет выполнять динамическую загрузку приватных и разделяемых сборок, причем находящихся в произвольных местах. По сути, класс Assembly предоставляет методы (в частности, Load () и LoadFrom ()), которые позволяют программно поставлять ту же информацию, которая встречается в клиентских файлах * . conf ig. Обратите внимание, что статическому методу Assembly. Load () передается только дружественное имя сборки, которую требуется загрузить в память.

Рефлексия разделяемых сборок

Метод Assembly. Load () имеет несколько перегруженных версий. Одна из них позволяет указать значение культуры (для локализуемых сборок), а также номер версии и значение маркера открытого ключа (для разделяемых сборок). Все вместе эти элементы, которые идентифицируют сборку, называются отображаемым именем (display name), формат которого выглядит так: сначала идет дружественное имя сборки, за ней строка разделенных запятыми пар "имя/значение", а потом необязательные спецификаторы (в любом порядке). Ниже приведен образец, которым следует пользоваться

(необязательные элементы указаны в круглых скобках):

Имя (, Vers ion = <старший номера .<мл а дший номер* .'помер сборки* .<номер редакции>)

(,Culture = <маркер культуры>) (,PublicKeyToken = <маркер открытого ключа>)