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

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

Из предыдущей главы вы узнали о том, как среда 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(" *** Типы компоновочного блока ***");

   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(" Введите имя компоновочного блока");

    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

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Компоновочные блоки .NET Независимо от того, какой язык .NET вы выберете для программирования, вы должны понимать, что хотя бинарные .NET-единицы имеют такие же расширения файлов, как COM-серверы и неуправляемые программы Win32 (*.dll или *.exe), их внутреннее устройство совершенно иное.


Одномодульные и многомодульные компоновочные блоки

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Одномодульные и многомодульные компоновочные блоки Во многих случаях компоновочные блоки .NET- это просто файлы двоичного кода (*.dll или *.exe). Поэтому, если вы строите *.dll .NET, можно считать, что файл двоичного кода и компоновочный блок – это одно и то же. Точно также, если вы


Ссылки на внешние компоновочные блоки

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Ссылки на внешние компоновочные блоки Вдобавок к указанию пространства имен с помощью ключевого слова C# using, необходимо указать компилятору C# имя компоновочного блока, содержащего реальное CIL-определение соответствующего типа. Выше уже упоминалось, что многие базовые


ГЛАВА 11. Компоновочные блоки .NET

Из книги Компьютерные советы (сборник статей) автора Автор неизвестен

ГЛАВА 11. Компоновочные блоки .NET Любое из приложений, описанных в этой книге в предыдущих десяти главах, было обычным "автономным" приложением, вся программная логика которого целиком содержались в одном выполняемом файле (*.exe). Однако одной из главных задач платформы .NET


Одномодульные и многомодульные компоновочные блоки

Из книги C++ для начинающих автора Липпман Стенли

Одномодульные и многомодульные компоновочные блоки Компоновочный блок можно скомпоновать из одного или нескольких модулей. Модуль – это просто обобщающий термин для обозначения двоичных файлов .NET. В большинстве случаев компоновочный блок компонуется из одного


Приватные компоновочные блоки

Из книги автора

Приватные компоновочные блоки Компоновочные блоки, которые создавались вами в этой главе до сих пор, инсталлировались, как приватные компоновочные блоки. Приватные компоновочные блоки должны размещаться в том же каталоге, что и приложение-клиент (такой каталог


Общедоступные компоновочные блоки

Из книги автора

Общедоступные компоновочные блоки Теперь, когда вы понимаете, как инсталлировать и конфигурировать приватные компоновочные блоки, мы с вами можем приступить к рассмотрению роли общедоступных компоновочных блоков. Подобно приватному компоновочному блоку,


Представление ссылок на другие компоновочные блоки

Из книги автора

Представление ссылок на другие компоновочные блоки Вдобавок к метке Assembly и набору меток TypeDef и TypeRef метаданные .NET используют метки "AssemblyRef #n", чтобы обозначить внешние компоновочные блоки. Например, поскольку CarLibrary.dll использует тип MessageBox, в окне метаданных вы обнаружите


Ссылки на внешние компоновочные блоки

Из книги автора

Ссылки на внешние компоновочные блоки С помощью любого редактора создайте новый файл, назвав его CilTypes.il. Сначала вы должны указать список внешних компоновочных блоков, используемых текущим компоновочным блоком (в нашем примере мы будем использовать только типы из


Динамические компоновочные блоки

Из книги автора

Динамические компоновочные блоки Как видите, процесс создания сложного приложения .NET непосредственно в CIL оказывается довольно трудоемким. С одной стороны, CIL является чрезвычайно выразительным языком программирования, позволяющим взаимодействовать со всеми


Использование динамически сгенерированного компоновочного блока

Из книги автора

Использование динамически сгенерированного компоновочного блока Теперь, когда имеется вся программная логика, позволяющая создать и сохранить компоновочный блок, нужен класс для запуска этой логики. Для того чтобы замкнуть цикл, предположим, что в проекте определен


Необходимые компоновочные блоки

Из книги автора

Необходимые компоновочные блоки Наконец, если Заглянуть в окно Solution Explorer, вы увидите, что проект Windows Forms автоматически ссылается на целый ряд компоновочных блоков, среди которых будут System.Windows.Forms.dll и System.Drawing.dll.Напомним, что подробное обсуждение System.Drawing.dll предполагается


Динамически компонуемые библиотеки

Из книги автора

Динамически компонуемые библиотеки Как вы имели возможность убедиться, средства управления памятью и отображения файлов оказываются важными и полезными для широкого класса программ. Системы управления памятью используются также самими ОС, и наиболее важной и


Блоки

Из книги автора

Блоки JavaScript позволяет нам объединить несколько выражений в одно. Такое выражение называется блочным выражением или просто блоком. Составляющие его выражения заключают в фигурные скобки, например:{b = "12";c = a — b;}Как правило, блоки не существуют сами по себе. Чаще всего они


Как работают блоки питания персональных компьютеров? Какие блоки питания бывают?

Из книги автора

Как работают блоки питания персональных компьютеров? Какие блоки питания бывают? http://pc-doc.spb.ru/atx.html Блок питания — жизненно важная часть компьютера, без которой его функционирование невозможно. Лишенный блока питания компьютер — всего лишь мертвая коробка, наполненная


8.4. Динамически размещаемые объекты

Из книги автора

8.4. Динамически размещаемые объекты Время жизни глобальных и локальных объектов четко определено. Программист неспособен хоть как-то изменить его. Однако иногда необходимо иметь объекты, временем жизни которых можно управлять. Выделение памяти под них и ее