Silverlight 2: Что внутри?


Надеюсь, вы уже видели Silverlight-приложение, знаете возможности этой технологии и, наверное, пробовали создавать свои приложения. Хочу рассказать, как это все работает внутри браузера и как устроено внутри плагина.

Silverlight-приложение и браузер
Когда вы запрашиваете страницу с Silverlight-приложением, происходит загрузка HTML и JavaScript, после чего происходит создание Silverlight-плагина и уже он начинает загружать приложение на сторону клиента. После создания плагина, происходит анализ расширения файла приложения. Если это xap-файл, то запускается CLR. После чего идет извлечения данных манифеста. Затем в домен приложения загружаются сразу ВСЕ сборки, которые находится в нашем архиве (xap-файле, он же zip-архив). Затем создается объект класса System.Windows.Application (точка входа в приложение), строится дерево элементов управления и отображается наше приложение. В режиме выполнения приложения можно изменять дерево элементов управления. Описанный алгоритм представлен на рис.1.

Инициализация Silverlight-приложения
Рис. 1 Инициализация Silverlight-приложения.


На рис.2 показана схема места расположения Silverlight приложения в процессе браузера.

Silverlight приложение и браузер
Рис.2 Silverlight приложение и браузер.


Как видите, для Silverlight-приложений у браузера есть своя песочница, аналогичная той, которая есть для выполнения JavaScript'а. В этой песочнице «играются» CoreCLR (общеязыковая исполняющая среда Silverlight'а), библиотеки времени выполнения, и домены Silverlight-приложений. Если на странице находится несколько приложений, у каждого будет свой домен. По своей структуре домен аналогичен «настольному».

CLR в Silverlight (ака CoreCLR)
Создание CoreCLR началось еще в 2005 году, после выхода CLR 2.0. В процессе ее разработки необходимо было решить две задачи: с одной стороны – размер играет важную роль, а с другой – необходима совместимость написанного кода между CoreCLR и настольной CLR. Как видим, разработчики Microsoft справились с поставленными задачами.
Структура CoreCLR (Рис. 3).

Структура CoreCLR
Рис. 3 Структура CoreCLR .


Механизм исполнения и виртуальная среда идентичны: метаданные, система типов, динамический компилятор, сборщик мусора, пул потоков и прочие ключевые механизмы среды. Хотя есть отличия в механизме работы некоторых компонентов. Например, сборщик мусора, в CoreCLR, настроен на работу с интерактивными приложения, а не под несколько рабочих потоков, которые используют похожие шаблоны выделения, как в настольной CLR; динамический компилятор сосредоточен на уменьшении времени запуска, а не на сложных оптимизациях. Но, метаданные и MSIL идентичны для обоих CLR (именно поэтому, вы можете легко посмотреть Silverlight сборки в Reflector’e).

Безопасность CoreCLR
Безопасность в CoreCLR разработана по принципу прозрачной безопасности. Суть данного подхода заключается в том, что весь код делится на три части: прозрачный(Transparent), безопасный критический(SafeCritical) и критический(Critical). Код уровня Transparent не имеет доступ к ресурсам и информации ПК и не может повышать права. Весь код разработчика находится на Transparent уровне. Уровень Critical может взаимодействовать с системой через P/Invoke или содержать неуправляемый код. SafeCritical представляет собой API для взаимодействия между прозрачным и критическим слоями. Обязанностью SafeCritical является помещения в стандартный формат ввода и вывода кода критического уровня для обеспечения безопасности. Пример взаимодействия между слоями показано на рис. 4.

Взаимодействие между слоями кода
Рис. 4 Взаимодействие между слоями кода.


Большая часть Silverlight и среда выполнения динамических языков написана на коде прозрачного уровня.

Кросс-платформенность
Так как CoreCLR разрабатывалась на базе настольной CLR 2.0, то для работы Silverlight в ОС Windows, сильно модифицировать что либо, не пришлось. Но как быть с другими системами? Ведь Mac OS имеет свой механизм взаимодействия с программным обеспечением, которое работает в ее среде. Для решения этой задачи был добавлен слой PAL (Platform Adaptation Layer). В обязанности этого слоя входит трансляция запросов от CoreCLR в запросы понятные API Mac OS и обратно. Именно те части, которые необходимы для работы Silverlight, но отсутствуют в Mac OS, были реализованы в PAL. Общая схема механизма кросс-платформенности показана на рис. 5.

Слой адаптации платформы
Рис. 5 Слой адаптации платформы.



Библиотека базовых классов.
Ввиду того, что была поставлена задача, минимизировать размеры плагина, был, проведет тщательный рефакторинг базовой библиотеки классов. Так как применяется принцип прозрачной безопасность в CoreCLR не включили Code Access Security, что позволило убрать часть System.Security из BCL. Нет необходимости и в Console (часть ее все такие присутствует, оставили для тестирования самой технологии). Отсутствует в BCL информация о культурах, потому как она уже есть в самих ОС. Класс CultureInfo, который присутствует в BCL, берет необходимые данные из ОС. Еще не были включены библиотеки драйверов для работы с БД. Это краткий список того, что не включили в BCL исполняющей среды Silverlight.

Заключение
Как видите, при разработке CoreCLR, разработчики компании Microsoft постарались на славу. Возможно, идеи и подходы, разработанные для CoreCLR, войдут в .Net Framework 4.0 и новая инфраструктура будет по настоящему кросс-платформенной.
В догонку ко всему выше сказанному, хочется посоветовать статью Andrew Pardoe«Программирование для Silverlight с помощью CoreCLR» и видео с PDC «Building an Optimized, Graphics-Intensive Application in Microsoft Silverlight» Seema Ramchandani .

 



Progg it
Опубліковані 23-03-2009 02:09 від Sergey Lutay
Зареєстрований як , ,

Коментарі

 

progg.ru said:

Thank you for submitting this cool story - Trackback from progg.ru

September 21, 2009 11:18 PM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.

Новини

Календар повідомлень

<March 2017>
SMTWTFS
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

Пошук

Go

Категорії повідомлень

Синдикація

SkinName:iroha_Blog2