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

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

Как вы можете догадываться, метод 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 для чтения метаданных компоновочного блока во время выполнения. Здесь я готов признать, что, несмотря на "фактор красоты" предлагаемого подхода, вам по роду своей деятельности вряд ли придется строить пользовательские навигаторы объектов. Но не следует забывать о том, что сервисы отображения являются основой целого ряда других, очень широко используемых подходов в программировании, включая и динамическое связывание.