1.3.3. Особенности разработки приложений .NETХотя архитектура .NET и гарантирует языковую совместимость между приложениями и внутри приложений, для реализации этой возможности при разработке приложений необходимо следовать некоторым правилам. И дело здесь не в ограниченности возможностей .NET, а в принципиальных трудностях. Например, как быть, если один язык программирования поддерживает беззнаковые типы данных (Delphi, C++), а другой (Java) - нет? Что делать, если один компилятор допускает перегружаемые методы, а другой - нет? Каким должен быть в таких случаях код MSIL? Как видно, объективные трудности существуют, и для их преодоления в архитектуру .NET включен ряд спецификаций. В .NET введено логическое понятие пространства имен, которое служит идентификации типов в общих библиотеках и приложениях. Приложения должны использовать общую систему типов (Common Type System), объединяющую типы данных и операций, присутствующие в большинстве языков программирования. При написании исходного кода приложений необходимо руководствоваться некоторыми правилами, которые объединены под названием Common Language Specification. Благодаря тому, что в состав кода приложений .NET включаются метаданные, имеется возможность добавлять к приложениям информацию об используемых типах, которая служит для проверки безопасности и совместимости кода. Это часть концепции управляемого кода .NET. Рассмотрим перечисленные решения более подробно.
Пространства имён
В .NET применяются пространства имен. Пространство имен - это логическая структура, объединяющая в своем составе другие пространства имен и типы. Ее основное предназначение - идентификация типов (в .NET под типом понимаются и классы, и интерфейсы) и предотвращение конфликтов именования типов. Пространства имен могут быть стандартными или созданными разработчиком. Типы именуются только с использованием названий пространств имен. Например, существует стандартное пространство имен System.IO, которое объединяет типы, отвечающие за выполнение операций файлового ввода/вывода. Как видно из представления, пространство имен IO - часть глобального пространства System. При помощи операторов используемого языка программирования вы можете добавить к приложению функции того или иного пространства имен. Концепция в чем-то аналогична модулям Delphi для Win32. Если требуется определить новый тип, то это должно быть сделано в рамках соответствующего пространства имен. К примеру, можно определить тип для хранения имен файлов XML для операций ввода/вывода и тогда обращение к нему в приложении .NET будет выглядеть так: System.IO.XMLFileName. В разных пространствах имен допускаются одноименные типы. Совокупность пространств имен .NET имеет иерархическую структуру, вершиной которой является пространство System. Глобальное пространство имен System объединяет все базовые операции и типы, существующие в .NET, и должно быть реализовано во всех средах разработки и языках программирования для .NET. Входящие в его состав пространства имен объединяют операции по основным направлениям функционирования приложения. Полный перечень базовых пространств имен можно найти в документации MSDN.
Общая система типов
Общая система типов (Common Type System, CTS) - это спецификация, которая объединяет все типы и операции, доступные в приложениях .NET. Она разработана путем анализа основных языков программирования высокого уровня, используемых в .NET, и является составной частью среды выполнения CLR, которая посредством CTS осуществляет верификацию кода и обеспечивает безопасность выполнения приложений. В рамках CTS определены несколько важнейших типов, дано их описание и условия применения. Все типы делятся на две большие группы. Одну составляют типы значений. Они всегда содержат данные. Вторую группу составляют ссылочные типы, которые хранят ссылки на области памяти. В зависимости от содержимого области памяти, ссылочный тип может быть классом, интерфейсом, массивом и т. д.
Правила межъязыкового взаимодействия
Для того чтобы приложение (или его фрагмент) правильно воспринималось другими приложениями, написанными на другом языке программирования, оно должно быть разработано с учетом правил спецификации Common Language Specification (CLS). CLS - это набор правил и ограничений, обеспечивающих полную интеграцию кодов, созданных в разных средах разработки и на разных языках программирования. Программный код, созданный с учетом правил межъязыкового взаимодействия, называется CLS- совместимым. При разработке обычных приложений знание правил CLS не требуется (или требуется в общих чертах для того, чтобы писать более эффективный код). Всю работу по обеспечению правил CLS берет на себя компилятор. Но если вы работаете над каким-либо API, который будет задействован в других приложениях, или ваши сборки будут использованы другими, то знания CLS необходимы.
Среда выполнения приложений .NET
В зависимости от компилятора, приложения .NET могут быть двух типов: с управляемым и неуправляемым кодом. Компилятор Borland DCCIL, а также компиляторы Microsoft C#, C++, Visual Basic в основном генерируют управляемый код. Для приложений с управляемым кодом обязательным условием работы является наличие Common Language Runtime — среды выполнения приложений .NET. Среда выполнения реализована в виде динамической библиотеки mscoree.dll. При попытке выполнить приложение .NET (если вы запускаете файл ЕХЕ или DLL приложения .NET) эта динамическая библиотека загружается автоматически и управляет процессом выполнения приложения. Она проводит приложение через следующие операции: 1. поиск файлов, запрашиваемых сборкой и их загрузка; 2. контроль версий и обеспечение безопасности; 3. поиск запрашиваемых типов внутри сборки; 4. компиляция кода MSIL в платформенно-зависимый код; 5. выполнение откомпилированного кода. В состав среды выполнения (Рис.4) входят следующие функциональные блоки. Загрузчик, который обеспечивает поиск необходимых файлов, перечисленных в списке манифеста сборки, и загрузку необходимых сборок. Рисунок 4. Схема работы компиляторов .NET Компилятор Just In Time (JIT), который транслирует только необходимый код MSIL (как правило, это отдельные процедуры) в платформенно-зависимый машинный код и сохраняет результат в оперативной памяти. Компилятор Native Image Generator (NGEN), который обрабатывает все приложение и сохраняет результат на жестком диске. Менеджер выполнения приложения, который обеспечивает выполнение откомпилированного кода и предоставляет приложению дополнительные службы. К дополнительным службам, предоставляемым менеджером выполнения, относятся: выделение памяти приложению - для впервые используемых откомпилированных блоков кода выделяется оперативная память и в дальнейшем код остается загруженным на случай повторного применения; сборка мусора - автоматическое освобождение неиспользуемой памяти и ресурсов по окончании работы приложения; контроль безопасности исполняемого кода - приложение не должно выполнять критические операции, влияющие на безопасность и устойчивость операционной системы.
|