Рекомендации по программированию

Большинство программ тем или иным образом работают с внешними устройства­ми, в качестве которых могут выступать, например, консоль, файл на диске или сетевое соединение. Взаимодействие с внешними устройствами организуется с по­мощью потоков, которые поддерживаются множеством классов библиотеки.NET.

Поток определяется как последовательность байтов и не зависит от конкретного устройства, с которым производится обмен. Классы библиотеки позволяют ра­ботать с потоками в различных режимах и на различных уровнях: на уровне дво­ичного представления данных, байтов и текста. Двоичные и байтовые потоки хранят данные во внутреннем представлении, текстовые — в кодировке Unicode. Поток можно открыть в синхронном или асинхронном режиме для чтения, записи или добавления. Доступ к файлам может быть последовательным и произволь­ным. Текстовые файлы позволяют выполнять только последовательный доступ, в двоичных и байтовых потоках можно использовать оба метода. Прямой доступ в сочетании с отсутствием преобразований обеспечивает высокую скорость обмена. Методы форматированного ввода для значений арифметических типов в С# не поддерживаются. Для преобразования из символьного в числовое представление используются методы класса Convert или метод Parse. Форматированный вывод выполняется с помощью перегруженного метода ToString, результат выполнения которого передается в методы текстовых файлов.

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

Для сохранения объектов (сериализации) используется атрибут [Serializable]. Объекты можно сохранять в одном из двух форматов: двоичном или SOAP (в виде XML-файла).

Сборки, библиотеки, атрибуты, директивы

Все наши предыдущие приложения состояли из одного физического файла. Для больших проектов это неудобно и чаще всего невозможно, да и в других случаях бывает удобнее поместить связанные между собой типы в библиотеку и исполь­зовать их по мере необходимости. В этой главе мы рассмотрим вопросы созда­ния и использования библиотек, способы получения и подготовки информации о типах, пространства имен и препроцессор. Эти сведения необходимы для ус­пешной разработки реальных программ.

Сборки

В результате компиляции в среде.NET создается сборка — файл с расширением ехе или dll, который содержит код на промежуточном языке, метаданные типов, ма­нифест и ресурсы (рис. 12.1). Понятие сборки было введено в главе 1 (см. с. 9), а сейчас мы рассмотрим ее составные части более подробно. Сборка состоит из следующих элементов:

1. Манифест

2. Метаданные

3. Код на языке IL

4. Ресурсы (не обязательно)

Промежуточный язык (Intermediate Language, IL) не содержит инструкций, зависящих от операционной системы и типа компьютера, что обеспечивает две основные возможности:

□ выполнение приложения на любом типе компьютера, для которого существу­ет среда выполнения CLR;

□ повторное использование кода, написанного на любом.NET-совместимом
языке.

IL-код можно просмотреть с помощью дизассемблера ILDasm.exe, который нахо­дится в папке...\SDK\bin\ каталога размещения Visual Studio.NET. После за­пуска ILDasm можно открыть любой файл среды.NET с расширением ехе или dll с помощью команды File ► Open. В окне программы откроется список всех эле­ментов сборки, сведения о каждом можно получить двойным щелчком. При этом открывается окно, в котором для методов выводится доступный для восприятия дизассемблированный код.

Метаданные типов — это сведения о типах, используемых в сборке. Компилятор создает метаданные автоматически. В них содержится информация о каждом типе, имеющемся в программе, и о каждом его элементе. Например, для каждого класса описываются все его поля, методы, свойства, события, базовые классы и интерфейсы.

Среда выполнения использует метаданные для поиска определений типов и их элементов в сборке, для создания экземпляров объектов, проверки вызова ме­тодов и т. д. Компилятор, редактор кода и средства отладки также широко ис­пользуют метаданные, например, для вывода подсказок и диагностических со­общений.

Манифест — это набор метаданных о самой сборке, включая информацию обо всех файлах, входящих в состав сборки, версии сборки, а также сведения обо всех внешних сборках, на которые она ссылается. Манифест создается компи­лятором автоматически, программист может дополнять его собственными ат­рибутами.

Чаще всего сборка состоит из единственного файла, однако она может вклю­чать и несколько физических файлов (модулей). В этом случае манифест либо включается в состав одного из файлов, либо содержится в отдельном файле. Многофайловые сборки используются для ускорения загрузки приложения — это имеет смысл для сборок большого объема, работа с которыми производится удаленно.

На логическом уровне сборка представляет собой совокупность взаимосвязан­ных типов — классов, интерфейсов, структур, перечислений, делегатов и ресур­сов. Библиотека.NET представляет собой совокупность сборок, которую исполь­зуют приложения. Точно так же можно создавать и собственные сборки, которые можно будет задействовать либо в рамках одного приложения (частные сборки), либо совместно различными приложениями (открытые сборки). По умолчанию все сборки являются частными.

Манифест сборки содержит:

□ идентификатор версии;

□ список всех внутренних модулей сборки;

□ список внешних сборок, необходимых для нормального выполнения сборки;

□ информацию о естественном языке, используемом в сборке (например, русском);

□ «сильное» имя (strong name) — специальный вариант имени сборки, используемый для открытых сборок;

□ необязательную информацию, связанную с безопасностью;

□ необязательную информацию, связанную с хранением ресурсов внутри сборки (подробнее о форматах ресурсов.NET см. [27]).

Идентификатор версии относится ко всем элементам сборки. Он позволяет из­бегать конфликтов имен и поддерживать одновременное существование и ис­пользование различных версий одних и тех же сборок. Идентификатор версии состоит из двух частей: информационной версии в виде текстовой строки и версии совместимости в виде четырех чисел, разделенных точками:

□ основной номер версии (major version);

□ дополнительный номер версии (minor version);

□ номер сборки (build number);

□ номер ревизии (revision number).

Среда выполнения применяет идентификатор версий для определения того, какие из открытых сборок совместимы с требованиями клиента. Например, если клиент запрашивает сборку 3.1.0.0, а присутствует только версия 3.4.0.0, сборка не будет опознана как подходящая, поскольку считается, что в дополнительных версиях могут произойти изменения в типах и их элементах. Разные номера ревизии допускают, но не гарантируют совместимость. Номер сборки на совместимость не влияет, так как чаще всего он изменяется при установке заплатки, или патча (patch).

Идентификатор версии формируется автоматически, но при желании можно за­дать его вручную с помощью атрибута [AssemblyVersion], который рассматривает­ся далее на с. 285.

Информация о безопасности позволяет определить, предоставить ли клиенту доступ к запрашиваемым элементам сборки. В манифесте сборки определены ог­раничения системы безопасности.

Ресурсы представляют собой, например, файлы изображений, помещаемых на форму, текстовые строки, значки приложения и т. д. Хранение ресурсов внут­ри сборки обеспечивает их защиту и упрощает развертывание приложения. Среда Visual Studio.NET предоставляет возможности автоматического внедре­ния ресурсов в сборку.

Открытые и частные сборки различаются по способам размещения на компьюте­ре пользователя, именованию и политике версий. Частные сборки должны нахо­диться в каталоге приложения, использующего сборку, или в его подкаталогах.

Открытые сборки размещаются в специальном каталоге, который называется глобальным кэшем сборок (Global Assembly Cache, GAC). Для идентификации открытой сборки используется уже упоминавшееся сильное имя (strong name), которое должно быть уникальным.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: