Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Создайте новый консольный проект (VehicleDescriptionAttributeReaderLateBinding) и скопируйте AttributedCarLibrary.dll в каталог \Bin\Debug этого проекта. Затем обновите метод Main() так, как предлагается ниже.
using System.Reflection;
namespace VehicleDescriptionAttributeReaderLateBinding {
class Program {
static void Main(string[] args) {
Console.WriteLine("*** Описания транспортных средств ***\n");
// Загрузка локальной копии AttributedCarLibrагу.
Assembly asm = Assembly.Load(AttributedCarLibrary");
// Получение информации типа для VehicleDescriptionAttribute.
Type vehicleDesc = asm.GetType("AttributedCarLibrary.VehicleDescriptionAttribute");
// Получение информации типа для свойства Description.
PropertyInfо propDesc = vehicleDesc.GetProperty("Description");
// Получение всех типов данного компоновочного блока.
Туре[] types = asm.GetTypes() ;
// Получение VehicleDescriptionAttribute для каждого типа.
foreach (Type t in types) {
object[] objs = t.GetCustomAttributes(vehicleDesc, false);
// Итерации по VehicleDescriptionAttribute и печать
// описаний с динамическим связыванием.
foreach(object о in objs) {
Console.WriteLine("-› {0}: {1}\n", t.Name, propDesc.GetValue(o, null));
}
}
Console.ReadLine();
}
}
}
Если вы внимательно анализировали все примеры этой главы, то листинг этого метода Main() должен быть для вас (более или менее) понятным. Единственным заслуживающим внимания моментом здесь является использование метода PropertyInfo.GetValue() для доступа к свойству. На рис. 12.10 показан соответствующий вывод.

Рис. 12.10. Отображение атрибутов при динамическом связывании
Исходный код. Проект VehiсleDescriptionAttributeReaderLateBinding размещен в подкаталоге, соответствующем главе 12.
Перспективы отображения, статического и динамического связывания и пользовательских атрибутов
Даже после множества примеров применения соответствующих подходов вам может быть не ясно, когда же следует использовать отображение, динамическую загрузку, динамическое связывание и пользовательские атрибуты в программах. Строго говоря, эти вопросы (которые увлекательны сами по себе) можно отнести, скорее, к теоретической стороне программирования (что можно считать как достоинством, так и недостатком, в зависимости от точки зрения). Чтобы спроецировать эти вопросы на реальность, нам нужен реальный пример. Представьте себе на минуту, что вы работаете в команде программистов, созданной для разработки приложения, удовлетворяющего следующему требованию:
• продукт должен допускать расширение путем подключения дополнительных программных средств, разработанных сторонними производителями.
Но что именно подразумевается под требованием допускать расширение? Рассмотрим Visual Studio 2005. При разработке этого приложения в нем были предусмотрены различные "гнезда" для подключения к IDE пользовательских модулей других производителей программного обеспечения. Ясно, что команда разработчиков Visual Studio 2005 не имела при этом возможности установить ссылки на внешние компоновочные блоки .NET, которые эта команда не разрабатывала (так что о статическом связывании не могло быть и речи). Поэтому закономерен вопрос: как именно это приложение смогло предложить необходимые гнезда подключения?
• Во-первых, расширяемое приложение должно предлагать некоторый входной механизм, который мог бы позволить пользователю указать модуль для подключения (это может быть, например, диалоговое окно или опция командной строки). При этом требуется динамическая загрузка.
• Во-вторых, расширяемое приложение должно выяснить, обладает ли модуль подходящими функциональными возможностями (например, набором необходимых интерфейсов), чтобы этот модуль можно было добавить в окружение. При этом требуется отображение.
• Наконец, расширяемое приложение должно получить ссылку на требуемую инфраструктуру (например, типы интерфейса) и вызвать члены, необходимые для запуска соответствующих функций. При этом часто требуется динамическое связывание .
Простыми словами, если расширяемое приложение было запрограммировано с учетом возможности запроса конкретных интерфейсов, оно сможет в среде выполнения проверить, активизирован ли соответствующий тип. Если такая проверка завершится успешно, запрошенный тип сможет поддерживать дополнительные интерфейсы, обеспечивающие полиморфную структуру функциональных возможностей. Именно этот подход был применен командой Visual Studio 2005, и этот подход оказывается не столь сложным для использования, как вы можете ожидать.
Создание расширяемого приложения
В следующих разделах мы с вами проанализируем пример, иллюстрирующий процесс создания расширяемого приложения Windows.Forms, которое можно будет расширять за счет функциональных возможностей внешних компоновочных блоков. Сам процесс программирования приложений Windows Forms мы здесь обсуждать не будем (этому будут посвящены главы 19, 20 и 21). Если вы не имеете опыта создания приложений Windows Forms, просто возьмите предлагаемый ниже программный код в качестве образца и следуйте соответствующим инструкциям (или постройте соответствующую консольную альтернативу).
Мы предполагаем, что наше расширяемое приложение должно иметь следующее компоновочные блоки.
• CommonSnappableTypes.dll. Компоновочный блок, содержащий определения типов, которые должны реализовываться каждым подключаемым расширением, поскольку на них будет ссылаться расширяемое приложение Windows Forms.
• CSharpSnapIn.dll. Расширение, созданное на языке C# и использующее типы CommonSnappableTypes.dll.
• VbNetSnapIn.dll. Расширение, созданное на языке Visual Basic .NET и использующее типы CommonSnappableTypes.dll.
• MyPluggableApp.exe. Приложение Windows Forms, функциональные возможности которого можно расширять с помощью подключаемых модулей. Это приложение будет использовать динамическую загрузку, отображение и динамическое связывание для динамического выяснения функциональных возможностей компоновочных блоков, о которых ранее не было ничего известно.
Создание CommonSnappableTypes.dll
Первой нашей задачей является создание компоновочного блока, содержащего типы, которые должен использовать каждый подключаемый модуль, чтобы обеспечить возможность его подключения к нашему приложению Windows Forms. Проект библиотеки классов CommonSnappableTypes определяет следующие два типа.
namespace CommonSnappableTypes {
public interface IAppFunctionality {
void DoIt();
}
[AttributeUsage(AttribyteTargets.Class)]
public sealed class CompanyInfoAttribute: System.Attribute
private string companyName;
private string companyUrl;
Интервал:
Закладка: