За кулисами WinRT

WinRT-компоненты — это COM-объекты. Они соответствуют правилам двоичного прикладного интерфейса (Application Binary Interface, ABI) — низкоуровневого интерфейса между компонентами, а также между операционной системой и другими компонентами. Компоненты, кроме того, реализуют специальный интерфейс IInspectable, который, в свою очередь, реализует интерфейс IUnknown.

Интерпретатор JavaScript будет использовать интерфейс IInspecatable для генерирования динамических языковых привязок. Интерпретатор берет имя класса, запрашивает метаданные для компонента у Windows и проецирует подходящие интерфейсы. Конечный результат заключается в том, что ваш JavaScript-код может получать доступ к WinRT-проекциям, и интерпретатор выполняет продвижение запросов к нижележащим компонентам. У интерпретатора есть собственный сборщик мусора, ответственный за очистку экземпляров объектов, когда они выходят из области видимости.

В версии .NET спроецированные классы на самом деле реализуют механизм COM Interoperability. .NET-приложение взаимодействует с CLR-классом, который работает с нижележащим WinRT-компонентом (COM), используя вызываемую оболочку времени выполнения (Runtime Callable Wrapper, RCW). Вызовы просто продвигаются нижележащим компонентам с использованием уровня проекции. Проекция управляет компонентами вместе со спроецированными типами. В итоге, опять же, собственный сборщик мусора платформы .NET заботится об объектах, выходящих из области видимости.

Говоря о комбинации C# и XAML, важно отметить то, что применяется полный вариант платформы .NET. Здесь присутствует специальный профиль .NET-приложений для Магазина Windows, который ограничивает использование основных библиотек базовых классов (BCL) небольшим набором и позволяет работать с уровнем проекции. Приложения, написанные на управляемом языке, зависят от среды исполнения платформы .NET. Дополнительная нагрузка из-за наличия проекции минимальна, поэтому при создании приложений можно не беспокоиться о сколь-нибудь существенном снижении производительности.

При использовании C++ взаимодействие с WinRT осуществляется через набор языковых расширений. Это позволяет компилятору представлять WinRT-компоненты в виде знакомых языковых паттернов с конструкторами, деструкторами, методами и исключениями. Управление памятью в C++ обычно производится путем так называемого «подсчета ссылок», но для WinRT-компонентов все делается «закулисными» механизмами, то есть управление ссылками осуществляется автоматически.

Наверх