Определение компонентов WinRT в коде C#
До настоящего момента рассматривались возможности использования компонентов
WinRT в C#. Однако вы также можете определять компоненты WinRT в коде C#
для последующего использования в C/C++, C#/Visual Basic, JavaScript и в других
языках. И хотя это возможно, стоит разобраться в том, в каких ситуациях такое
решение оправдано. Например, бессмысленно определять компонент WinRT на C#,
если он будет использоваться только в других управляемых языках, работающих
поверх CLR. Дело в том, что система типов WinRT обладает существенно меньшей
функциональностью, ограничивающей ее возможности по сравнению с системой
типов CLR.
Я также считаю, что было бы неразумно реализовать в коде C# компонент
WinRT, предназначенный для использования в неуправляемом коде C/C++. Ско-
рее всего, разработчики, пишущие свои приложения на C/C++, сильно озабочены
производительностью и/или затратами памяти в своих приложениях. Вряд ли
716
Глава.25 .Взаимодействие.с.компонентами.WinRT
они захотят использовать компонент WinRT, реализованный на управляемом
коде, потому что это потребует загрузки CLR в процесс, а следовательно, приведет
к увеличению затрат памяти и снижению производительности из-за уборки мусора
и JIT-компиляции кода. По этой причине многие компоненты WinRT (включая
компоненты, входящие в поставку Windows) реализованы в неуправляемом коде.
Конечно, в неуправляемых приложениях C++ могут быть части, не столь критичные
по производительности, и в некоторых ситуациях привлечение функциональности
.NET Framework для повышения продуктивности разработки оправдано. Напри-
мер, сервис Bing Maps использует неуправляемый код C++ для прорисовки своего
пользовательского интерфейса с применением DirectX, а в реализации бизнес-ло-
гики также применяется C#.
Итак, по моему мнению, компоненты WinRT, реализованные на C#, лучше всего
подходят для разработчиков приложений Windows Store, которые строят пользова-
тельский интерфейс средствами HTML и CSS, а затем используют JavaScript для
связывания интерфейса с бизнес-логикой, реализованной в виде компонента WinRT.
Другой возможный сценарий — использование функциональности существующих
компонентов FCL из приложений HTML/JavaScript.
Разработчики, работающие с HTML и JavaScript, уже готовы к затратам памяти
и снижению производительности, обусловленными использованием браузерного
ядра. Скорее всего, дополнительные затраты памяти и снижение производитель-
ности из-за использования CLR для них не будут критичными.
Построение компонента WinRT на C# начинается с создания в Microsoft Visual
Studio проекта типа
Windows.Runtime.Component
. При этом создается вполне обычный
проект библиотеки классов, однако компилятор C# будет запущен с параметром
командной строки
/t:winmdobj
для создания файла с расширением
winmdobj
. При
наличии этого параметра компилятор также генерирует часть IL-кода иначе, чем
при обычном запуске. Например, компоненты WinRT добавляют и удаляют деле-
гатов событий не так, как это делает CLR, поэтому компилятор включает другой
код в методы
add
и
remove
событий. Позднее в этом разделе я покажу, как явно
реализовать методы
add
и
remove
событий.
Когда компилятор создаст файл
winmdobj
, запускается утилита экспорта WinMD
(
WinMDExp exe
), которой передаются созданные компилятором файлы
winmdobj
,
pdb
и
xml
(
doc
). Программа
.WinMDExp exe
анализирует метаданные файла и убеж-
дается в том, что типы соответствуют правилам системы типов WinRT (см. начало
главы). Она также изменяет метаданные, содержащиеся в файле
winmdobj
; IL-код
при этом остается неизменным. Говоря конкретнее, все типы CLR отображают-
ся на эквивалентные типы WinRT. Например, ссылка на тип .NET Framework
IList
заменяется ссылкой на тип WinRT
IVector
. Результат
работы
WinMDExp exe
представляет собой файл
winmd
, который может использо-
ваться другими языками программирования.
Содержимое файла
winmd
можно просмотреть в программе
ILDasm exe
. По умол-
чанию программа
ILDasm exe
выводит необработанное содержимое файла, но с па-
717
Определение.компонентов.WinRT.в.коде.C#
раметром командной строки
/project
она покажет, как будут выглядеть метаданные
после проецирования типов WinRT на эквивалентные типы .NET Framework.
В следующем коде продемонстрирована реализация различных компонентов
WinRT на C#. В компонентах задействованы многие возможности, упоминавшие-
ся в этой главе, а многочисленные комментарии объясняют суть происходящего.
Если вам потребуется написать компонент WinRT на C#, я рекомендую взять при-
веденный код за образец.
Do'stlaringiz bilan baham: |