Вход/Регистрация
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
вернуться

Троелсен Эндрю

Шрифт:

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 в каталог \Bin\Debug приложения ExternalAssemblyReflector. После этого вывод программы будет аналогичен показанному на рис. 12.4.

Рис. 12.4. Отображение внешнего компоновочного блока CarLibrary

Замечание. Чтобы приложение ExternalAssemblyReflector было более гибким, следует загружать внешний компоновочный блок с помощью Assembsly.LoadFrom, а не с помощью Assembly.Load. Тогда вы сможете указать для соответствующего компоновочного блока абсолютный путь (например, C:\MyApp\MyAsm.dll).

Исходный код. Проект ExternalAssemblyReflector размещен в подкаталоге, соответствующем главе 12.

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

Как вы можете догадываться, метод Assembly.Load является перегруженным. Один из вариантов метода Assembly.Load позволяет указать значение параметра culture (для локализованных компоновочных блоков), а также номер версии и значение открытого ключа (для общедоступных компоновочных блоков).

Весь набор элементов, идентифицирующих компоновочный блок, называют дисплейным (или отображаемым) именем. По своему формату дисплейное имя представляет собой строку пар имен и значений, разделенных запятыми, которая начинается с понятного имени компоновочного блока и продолжается необязательными определениями (они могут указываться в любом порядке). Вот как выглядит соответствующий шаблон (в скобках указаны необязательные элементы).

Name (,Culture = код_языка) (,Version = _главный_номер.дополнительный_номер.номер_компоновки.номep_вapиaнтa) (,PublicKeyToken= код_открытого_ключа)

Значение PublicKeyToken = null в строке, определяющей дисплейное имя, указывает на то, что при связывании проверка строгого имени не требуется и его наличие у компоновочного блока не обязательно. Значений Culture = "" сообщает о необходимости использований значения кода локализации, принятого на машине по умолчанию, например:

// Загрузка CarLibrary версии 1.0.982.23972 с кодом локализации,

// используемым по умолчанию.

Assembly a = Assembly.Load(@"CarLibrary,Version=1.0.982.23972,PublicKeyToken=null,Culture=''");

Пространство имен System.Reflection предлагает также тип AssemblyName, который позволяет представить указанную выше информационную строку в объектной переменной. Обычно этот класс используется вместе с System.Version, являющимся объектным контейнером для номера версии компоновочного блока. Создав дисплейное имя, вы можете передать его перегруженному методу Assembly.Load.

// Использование AssemblyName для определения дисплейного имени.

AssemblyName asmName;

asmName = new AssemblyName;

asmName.Name = "CarLibrary";

Version v = new Version("1.0.982.23972");

asmName.Version = v;

Assembly a = Assembly.Load(asmName);

Чтобы загрузить общедоступный компоновочный блок из GAC, параметр Assembly.Load должен указать значение publickeytoken. Предположим, на-пример, что вы хотите загрузить компоновочный блок System.Windows.Forms.dll версии 2.0.0.0, предлагаемый библиотеками базовых классов .NET. Поскольку число типов в этом компоновочном блоке очень велико, следующее приложение выводит имена только первых 20 типов.

using System;

using System.Reflection;

using System.IO;

namespace SharedAsmReflector {

public class SharedAsmReflector {

private static void DisplayInfo(Assembly a) {

Console.WriteLine("***** Информация о компоновочном блоке *****");

Console.WriteLine("Загружен из GAC? {0}", a.GlobalAssemblyCache);

Console.WriteLine("Имя: {0}", a.GetName.Name);

  • Читать дальше
  • 1
  • ...
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: