Весь набор элементов, идентифицирующих компоновочный блок, называют
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("***** Отображение общедоступных КБ *****\n");
// Загрузка 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.