Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Объектно-ориентированное программирование.-6

.pdf
Скачиваний:
6
Добавлен:
05.02.2023
Размер:
4.5 Mб
Скачать

(typelib), генерируемые компонентами Component Object Model (COM). Ме-

таданные, порождаемые .NET-компилятором, как правило, не только намного выразительнее и полнее, чем библиотеки типов COM, к которым мы успели привыкнуть. Метаданные также всегда внедрены в EXE-файл. Благодаря этому исключены случайные потери метаданных приложения и рассогласование файлов.

Причина использования метаданных очевидна. Благодаря этой технологии CLR узнает, какие во время выполнения потребуются типы, и какие методы должны быть вызваны. Это дает среде возможность выполнить должную настройку для более эффективного выполнения приложения. Механизм запроса метаданных называется отражением (reflection). Библиотеки классов .NET Framework имеют целый набор методов отражения, позволяющих любому приложению (и не только CLR) запросить метаданные другого приложения.

Такие инструменты, как Visual Studio .NET, используют методы отражения для реализации средств подобных IntelliSense. При наличии IntelliSense вы, набирая имя метода, видите на экране всплывающий список с аргументами этого метода. Среда Visual Studio .NET дополняет это средство, показывая еще и все члены типа. Об API отражения см. § 5.3.

31

Рис. 2.2 – Приложение C# «Hello, World!», отображенное в ILDASM

Еще один чрезвычайно полезный инструмент .NET, использующий преимущество отражения – Microsoft .NET Framework IL Disassembler (ILDASM). Эта мощная утилита выполняет синтаксический разбор метаданных выбранного приложения, а затем отображает информацию о нем в виде дерева. На рисунке 2.2 показано, как выглядит приложение «Hello, World!»

на C# в ILDASM.

На втором плане – главное окно IL Disassembler. Если дважды щелкнуть метод Main в иерархическом дереве, на переднем плане появится окно, отображающее подробности метода Main.

Как уже было сказано, компилятор .NET не создает исполняемые файлы (EXE и DLL) в традиционном виде. Вместо машинного кода он вставляет в них декларацию (manifest) со списками типов и классов, включенных в файл, а также коды MSIL-инструкций, подлежащих компиляции и выполнению либо установочным приложением, либо исполняющей средой .NET по-

32

средством JIT-компиляторов (JITter).

Очень важно, что сгенерированный MSIL-код похож на язык ассемблера и может использоваться в качестве учебного пособия, показывающего, что сделал компилятор с вашим кодом. Для просмотра выходного MSIL-файла можно использовать дисассемблер Microsoft .NET Framework IL Disassembler (ILDASM), позволяющий открыть выполняемый .NET-файл (EXE или DLL) и изучить его пространства имен, классы, типы и код (подробнее мы с ним познакомимся в п. 2.3.6).

2.2.6.Преимущества .NET

2.2.6.1.Безопасность

Самый важный аспект любой среды разработки распределенных приложений – способ обеспечения безопасности. Раньше бытовало мнение, что не стоит всерьез рассматривать Microsoft в отношении серверных решений для предприятий, пока она полностью не обновит подход к безопасности, в

.NET появилось сразу несколько новых концепций. Работа системы безопасности начинается с того момента, когда CLR загружает класс, поскольку загрузчик классов является частью системы безопасности .NET. Так, при загрузке класса в .NET во время выполнения проверяются правила доступа и его внутренняя целостность. Кроме того, в ходе такой проверки выясняется, какая часть кода имеет надлежащие разрешения на доступ к определенным ресурсам. Система безопасности гарантирует проверку предписанных ролей и идентификационных данных. Чтобы не подвергать риску наиболее ответственные данные в распределенных вычислительных средах, эти проверки безопасности не ограничиваются рамками отдельных процессов и машин.

2.2.6.2. Развертывание

Развертывание – наиболее неприятная процедура разработки крупных распределенных систем. Любой разработчик серьезных Windows-программ может рассказать, как занимался при развертывании своих приложений размещением массы разнообразных двоичных и текстовых файлов, проблемами реестра Windows, компонентами СОМ, установкой библиотек поддержки та-

ких продуктов, как Open Database Connectivity (ODBC) и Data Access Objects (DAO) и т.д. В противовес этому, развертывание – это та часть .NET, над ко-

33

торой проектировщики хорошо потрудились.

Ключ к развертыванию .NET-приложений – концепция сборок (assemblies). Сборкой называют пакет из семантически близких объектов, состоящий из одного или нескольких файлов. Особенности развертывания зависят от того, что вы разрабатываете – Web-серверное приложение или локальное приложение для Windows. Однако, с введением сборки как полностью инкапсулированного набора функциональных возможностей, развертывание сводится к простому копированию нужных сборок в место назначения.

Масса проблем, требующих усилий программистов до появления .NET Framework, теперь устранено. Теперь, например, не надо регистрировать компоненты (как это требуют COM и элементы управления ActiveX), поскольку благодаря метаданным и отражению все компоненты содержат в себе собственное описание. Во время выполнения .NET отслеживает также работу с файлами и версии файлов, связанных с приложением. Поэтому любое устанавливаемое приложение автоматически связывается с файлами, являющимися частью его сборки. Если программа установки попытается перезаписать файл, необходимый другому приложению, .NET разрешит установить нужные файлы, не удалив при этом предыдущие версии, поскольку они еще нужны другому приложению.

2.2.6.3. Взаимодействие с неуправляемым кодом

Неуправляемым (unmanaged code) называется код, который не находится под надзором .NET. Этот код тоже запускается средствами .NET, однако, у него нет тех преимуществ, которыми обладает управляемый код: сбора мусора, унифицированной системы типов и метаданных. Зачем тогда запускать неуправляемый код в среде .NET? Без особой нужды этого делать не стоит. Однако в некоторых случаях без этого не обойтись:

Когда управляемый код вызывает функции неуправляемых библиотек DLL. Допустим, нашему приложению нужно работать с DLL, написанной на C, а компания, создавшая эту библиотеку, пока не адаптировала ее для технологии .NET. В этом случае нам придется по-прежнему вызывать эту DLL из .NET-приложения.

Когда управляемый код использует компоненты COM. По той же причине, по какой нужно вызывать из своего приложения .NET функции DLL, написанной на C, нам требуется продолжать поддержку компонентов

34

COM. Выход в том, чтобы создать .NET-оболочку для компонента COM так, чтобы управляемый клиент полагал, будто он работает с .NET-классом.

• Когда пишется неуправляемый код, использующий .NET-службы. Здесь противоположная проблема: нам нужен доступ к .NET из неуправляемого кода. Она решается с помощью обратного подхода: клиент COM вводится в заблуждение, будто он работает с COM-сервером, который на самом деле является .NET-службой того же вида.

2.2.6.4. Очистка объектов и управление ресурсами

Возможность обеспечивать очистку и освобождение ресурсов после завершения исполнения компонентов – одна из самых важных функций системы на основе компонентов. Под «очисткой и освобождением ресурсов» понимается своевременное освобождение ссылок на другие компоненты и освобождение ресурсов, количество которых невелико или ограничено, за которые идет конкуренция (например, соединения с базой данных, описатели файлов и коммуникационные порты). Под «завершением» понимается тот момент, когда объект более не используется. В C++ очистку осуществляет деструктор (destructor) объекта – определенная для каждого объекта C++ функция, автоматически выполняемая при выходе объекта из области видимости. Однако, деструктор не вызывается автоматически для динамических объектов. В мире Microsoft .NET очистку объектов автоматически производит .NET Garbage Collector (GC). В силу некоторых причин эта стратегия противоречива, поскольку в отличие от предсказуемости C++, исполнение кода завершения объекта в решениях .NET основано на модели с отложенными вычислениями («lazy» model). Так, GC использует фоновые потоки, определяющие, что ссылок на объект больше не осталось. Другие потоки GC, в свою очередь, отвечают за исполнение кода завершения данного объекта.

35

§2.3. Hello, World!

Вкачестве примера создадим простейшую программу на языке C#, выводящую в консольное окно фразу «Hello, World!».

2.3.1.Выбор среды разработки

Прежде, чем приступать непосредственно к программированию, нужно определиться, с помощью чего мы будем создавать программы на языке C#.

Необходимо понимать, что среда разработки .NET и среда выполнения

.NET Framework (.NET Framework Runtime) – независимые, в общем-то, друг от друга компоненты. Если на компьютере ранее уже были установлены программы, требующие наличия .NET Framework, то среда исполнения также может быть установлена вместе с ними. Это легко проверить – достаточно зайти в папку, где установлена операционная система Windows, и найти там папку Microsoft.NET\Framework (рис. 2.3).

Рис. 2.3 – Установленные версии .NET Framework

36

Как видно из рисунка 2.3, на данном ПК установлены пять версий .NET Framework – 1.0, 1.1, 2.0, 3.0 и 3.5. В принципе, достаточно наличия одной версии, если она не ниже требуемой. Далее необходимо проверить, имеется ли для данной версии .NET Framework компилятор C#. Например, проверим версию 3.5 (рис. 2.4).

Рис. 2.4 – Установленные компоненты .NET Framework 3.5

Файл «CSC.EXE» – это и есть компилятор языка C#. Могут быть установлены и другие компиляторы:

«JSC.EXE» – компилятор JScript;

«VJC.EXE» – компилятор J#;

«VBC.EXE» – компилятор Visual Basic;

«CL.EXE» – компилятор Visual C++;

ит.д. Если компилятор C# отсутствует (либо отсутствует компилятор требуемой версии), то достаточно установить .NET Framework Runtime из центра загрузок Microsoft (microsoft.com/downloads/ru-ru). Размер полного дистрибу-

тива версии 4.0 – около 50 Мб.

37

В качестве среды разработки можно использовать:

обычный Блокнот Windows;

текстовый редактор с подсветкой синтаксиса, например, Notepad++, который можно скачать с сайта разработчиков notepad-plus-plus.org/ru/ downloads, с сайта sourceforge.net/projects/notepad-plus/files/notepad%2B%2B %20releases%20binary/ (размер дистрибутива версии 5.6 – 3 Мб, версии 5.7 – 4 Мб, к учебнику прилагается дистрибутив версии 5.6.7);

специализированная среда разработки, например, SharpDevelop, которую можно скачать с сайта разработчиков www.icsharpcode.net/OpenSource/ SD/Download/Default.aspx (размер дистрибутива версии 2.2 – 8 Мб, версии

3.2– 15 Мб, к учебнику прилагается дистрибутив версии 3.2).

Однако, учитывая, что Microsoft, как разработчик технологии .NET Framework и языка C#, предоставляет собственную официальную бесплатную версию среды разработки Visual Studio Express Edition, можно скачать (с сайта Microsoft или любого другого) и установить ее, при этом будет также установлена и соответствующая версия .NET Framework Runtime. Бесплатная версия включает такие продукты, как Visual C#, Visual Basic, Visual C++ и

Visual Web Developer. Полная версия дистрибутива Visual Studio 2008 Express Edition имеет объем около 820 Мб (включает .NET Framework Runtime 3.5), Visual Studio 2010 Express Edition – 1,7 Гб (включает .NET Framework Runtime 4.0).

Отдельно стоит остановиться на справочной системе – Microsoft Developer Network Library (библиотека MSDN). Имеется тенденция по переносу справочной системы в Internet (сайт msdn.microsoft.com/ru-ru/library). Такой подход имеет как плюсы (оперативное обновление справочной системы), так и минусы – невысокая скорость доступа к справочной системе (по сравнению с локальной справкой), постоянный внешний сетевой трафик. Причем, начиная с Visual Studio 2010, локальная версия справочной системы больше не выпускается. У пользователей Visual Studio 2008 есть выбор – можно использовать справку по сети, а можно установить локальную версию MSDN Library for Visual Studio 2008. Русифицированный вариант дистрибутива MSDN Library for Visual Studio 2008 имеет размер около 2,2 Гб. При этом можно выбирать, какой источник справки будет первичным (рис. 2.5).

38

Рис. 2.5 – Выбор первичного источника справки

2.3.2. Создание программы

Рассмотрим все три варианта написания исходного кода программы – в обычном текстовом редакторе, в специализированной среде и в официальной среде разработки.

2.3.2.1. Использование текстового редактора

Запускаем Блокнот Windows (меню «Пуск → Программы → Стандартные → Блокнот» или «Пуск → Выполнить… → notepad») и набираем следующий текст (его анализ мы осуществим позже):

using System;

namespace Sample_2_3

{

class Program

{

public static int Main(string[] args)

{

Console.WriteLine("Hello, World!"); return 0;

}

}

}

39

Затем сохраним текст в каком-либо файле с расширением .cs. Например, в файле с именем «Sample_2_3_text.cs» (рис. 2.6).

Рис. 2.6 – Программа на C# в Блокноте Windows

Можно использовать редактор с подсветкой синтаксиса. Например, редактор Notepad++ имеет варианты подсветки для многих языков, в т.ч. и для

C# (рис. 2.7).

Рис. 2.7 – Программа на C# в редакторе Notepad++

Для набора текста программы можно также использовать файловые менеджеры со встроенными редакторами (Far Manager и т.д.). К ним также

40