Отображение общедоступных компоновочных блоков
Отображение общедоступных компоновочных блоков
Как вы можете догадываться, метод 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);
Console.WriteLine("Версия: {0}", a.GetName().Version);
Console.WriteLine("Культура: {0}", a.GetName().CultureInfo.DisplayName);
Type[] types = a.GetTypes();
for (int i = 0; i ‹ 20; i++) Console.WriteLine("Тип: {0}", types[i]);
}
}
static void Main(string[] args) {
Console.WriteLine("***** Отображение общедоступных КБ ***** ");
// Загрузка System.Windows.Forms.dll из GAC.
string displayName = null;
displayName = "System.Windows.Forms," +
"Version=2.0.0.0," +
"PublicKeyToken=b77а5c561934e089" +
@"Culture='";
Assembly asm = Assembly.Load(displayName);
DisplayInfo(asm);
Console.ReadLine();
}
}
}
Исходный код. Проект SharedAsmReflector размещен в подкаталоге, соответствующем главе 12.
Чудесно! К этому моменту нашего обсуждения вы должны понять, как использовать некоторые базовые элементы из пространства имен System.Reflection для чтения метаданных компоновочного блока во время выполнения. Здесь я готов признать, что, несмотря на "фактор красоты" предлагаемого подхода, вам по роду своей деятельности вряд ли придется строить пользовательские навигаторы объектов. Но не следует забывать о том, что сервисы отображения являются основой целого ряда других, очень широко используемых подходов в программировании, включая и динамическое связывание.