Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Динамически загружаемые компоновочные блоки
Динамически загружаемые компоновочные блоки
Из предыдущей главы вы узнали о том, как среда CLR использует информацию манифеста компоновочного блока при зондировании компоновочных блоков по внешним ссылкам. Все это, конечно, хорошо, но во многих случаях бывает необходимо "на лету" загрузить компоновочный блок программными средствами, а записей о соответствующем компоновочном блоке в манифесте нет. Формально загрузка внешних компоновочных блоков по запросу называется динамической загрузкой.
В рамках System.Reflection определяется класс, имя которого Assembly. Используя этот тип, можно динамически загрузить любой компоновочный блок, а также выяснить его свойства. Используя тип Assembly, можно динамически загружать приватные и общедоступные компоновочные блоки, размещенные в любом месте системы. Класс Assembly предлагает методы (в частности, Load() и LoadFrom()), позволяющие программными средствами получать информацию, аналогичную той, которая содержится в файле *.config клиента.
Для примера использования динамической загрузки создайте новое консольное приложение с именем ExternalAssemblyReflector. Вашей задачей является построение метода Main(), запрашивающего понятное имя компоновочного блока для динамической загрузки. Ссылка Assembly будет передана вспомогательному методу DisplayTypes(), который просто напечатает имена всех, классов, интерфейсов, структур, перечней и делегатов соответствующего компоновочного блока. Необходимый программный код выглядит довольно просто.
using System;
using System.Reflection;
using System.IO; // Для определения FileNotFoundException.
namespace ExternalAssemblyReflector {
class Program {
static void DisplayTypesInAsm(Assembly asm) {
Console.WriteLine("n*** Типы компоновочного блока ***");
Console.WriteLine("-› {0}", asm.FullName);
Type[] types = asm.GetTypes();
foreach (Type t in types) Console.WriteLine("Тип: {0}", t);
Console.WriteLine(");
}
static void Main(string[] args) {
Console.WriteLine("*** Обзор внешних компоновочных блоков ***");
string asmName = ";
bool userIsDone = false;
Assembly asm = null;
do {
Console.WriteLine("nВведите имя компоновочного блока");
Console.Write("или нажмите Q для выхода из приложения:");
// Получение имени компоновочного блока.
asmName = Console.ReadLine();
// Желает ли пользователь завершить работу приложения?
if (asmName.ToUpper() == "Q") {
userIsDone = true;
break;
}
// Попытка загрузить компоновочный блок.
try {
asm = Assembly.Load(asmName);
DisplayTypesInAsm(asm);
} catch {
Console.WriteLine("Извините, компоновочный блок не найден.");
}
} while (userIsDone);
}
}
}
Обратите внимание на то, что статическому методу Assembly.Load() передается только понятное имя компоновочного блока, который вы хотите загрузить в память. Поэтому, чтобы получить отображение CarLibrary.dll с помощью этой программы, перед ее выполнением нужно скопировать двоичный файл CarLibrary.dll в каталог BinDebug приложения ExternalAssemblyReflector. После этого вывод программы будет аналогичен показанному на рис. 12.4.
Рис. 12.4. Отображение внешнего компоновочного блока CarLibrary
Замечание. Чтобы приложение ExternalAssemblyReflector было более гибким, следует загружать внешний компоновочный блок с помощью Assembsly.LoadFrom(), а не с помощью Assembly.Load(). Тогда вы сможете указать для соответствующего компоновочного блока абсолютный путь (например, C:MyAppMyAsm.dll).
Исходный код. Проект ExternalAssemblyReflector размещен в подкаталоге, соответствующем главе 12.
- Метаданные типов
- Отображение типов в .NET
- Создание пользовательского приложения для просмотра метаданных
- Динамически загружаемые компоновочные блоки
- Отображение общедоступных компоновочных блоков
- Динамическое связывание
- Программирование с помощью атрибутов
- Создание пользовательских атрибутов
- Атрибуты уровня компоновочного блока (и уровня модуля)
- Отображение атрибутов при статическом связывании
- Отображение атрибутов при динамическом связывании
- Перспективы отображения, статического и динамического связывания и пользовательских атрибутов
- Создание расширяемого приложения
- Резюме
- Статистика по блокировкам
- Создание файлов с блокировкой
- Динамические массивы
- 1.4. Динамические аспекты Ruby
- Не допускайте того, чтобы поток пользовательского интерфейса блокировался на длительное время
- Часть I Скрываем свое местонахождение и посещаем заблокированные сайты
- Блоки питания, используемые в компьютерах
- ГЛАВА 8 Блокировки чтения-записи
- Не хочу, чтобы компьютером пользовались в мое отсутствие. Как установить пароль и блокировать машину?
- Как заблокировать компьютер с помощью командной строки?
- Можно ли заблокировать клавиши для выключения компьютера?
- Динамические фильтры