Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В рамках 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("\n*** Типы компоновочного блока ***");
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("\nВведите имя компоновочного блока");
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 было более гибким, следует загружать внешний компоновочный блок с помощью A s sembsly.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);
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.
Чудесно! К этому моменту нашего обсуждения вы должны понять, как использовать некоторые базовые элементы из пространства имен System.Reflection для чтения метаданных компоновочного блока во время выполнения. Здесь я готов признать, что, несмотря на "фактор красоты" предлагаемого подхода, вам по роду своей деятельности вряд ли придется строить пользовательские навигаторы объектов. Но не следует забывать о том, что сервисы отображения являются основой целого ряда других, очень широко используемых подходов в программировании, включая и динамическое связывание.
Читать дальшеИнтервал:
Закладка: