Среда выполнения Windows ( WinRT ) — это независимый от платформы компонент и архитектура приложений, впервые представленная в Windows 8 и Windows Server 2012 в 2012 году. Она реализована на C++ и официально поддерживает разработку на C++ (через C++/WinRT , C++/CX или WRL). Rust/WinRT , Python/WinRT , JavaScript — TypeScript , а также языки управляемого кода C# и Visual Basic .NET (VB.NET).
WinRT — это не среда выполнения в традиционном смысле, а скорее независимый от языка двоичный интерфейс приложения , основанный на COM , позволяющий использовать объектно-ориентированные API с нескольких языков, при этом службы обычно предоставляются полнофункциональной средой выполнения, например, активация типов. [1] То есть WinRT — это «система доставки API». Приложения, использующие среду выполнения Windows, могут работать в изолированной среде, чтобы обеспечить большую безопасность и стабильность, и могут поддерживать как x86 , так и ARM . [2] [3] Компоненты WinRT разработаны с учетом совместимости нескольких языков и API, включая собственные, управляемые языки и языки сценариев. Встроенные API, предоставляемые Windows и использующие WinRT ABI, обычно известны как WinRT API; однако любой может использовать WinRT ABI для своих собственных API.
WinRT реализован на языке программирования C++ [4] и является объектно-ориентированным по своей конструкции. [4] Базовая технология Windows API (Win32 API) написана в основном на языке C. [5] Это неуправляемый двоичный интерфейс приложения, основанный на модели компонентных объектов (COM), который позволяет взаимодействовать с несколькими языками, как и COM. Однако определения API хранятся в .winmd
файлах, закодированных в формате метаданных ECMA 335 , который .NET Framework также использует с некоторыми изменениями. Для компонентов WinRT, реализованных в машинном коде, файл метаданных содержит только определения методов, классов, интерфейсов и перечислений, а реализация предоставляется в отдельной DLL. [6] [7] [8] Этот общий формат метаданных упрощает использование WinRT API из приложений .NET с более простым синтаксисом, чем P/Invoke . [9] [ ненадежный источник? ] Windows предоставляет набор встроенных API-интерфейсов, основанных на WinRT ABI, которые предоставляют все, от библиотеки WinUI на основе XAML до доступа к устройствам, таким как камера, микрофон и т. д.
Предыдущий язык C++/CX (расширения компонентов), который заимствовал некоторую часть синтаксиса C++/CLI , был введен для написания и использования компонентов WinRT с меньшим количеством связующего кода, видимого программисту, по сравнению с классическим COM-программированием на C++, и налагал меньше ограничений по сравнению с классическим COM-программированием на C++. C++/CLI о смешивании типов. Расширения компонентов C++/CX рекомендуется использовать только на границе API, а не для других целей. [10] Обычный C++ (с дисциплиной, специфичной для COM) также можно использовать для программирования с компонентами WinRT, [11] с помощью библиотеки шаблонов C++ среды выполнения Windows (WRL), которая по назначению аналогична той, которую предоставляет библиотека активных шаблонов. для COM. [12] В 2019 году Microsoft отказалась от C++/CX в пользу библиотеки заголовков C++/WinRT . [13]
Большинство приложений WinRT работают в изолированной программной среде и требуют явного разрешения пользователя для доступа к критическим функциям ОС и базовому оборудованию. По умолчанию доступ к файлам ограничен несколькими заранее определенными местами, например каталогами «Документы» или «Изображения». [14]
Приложения WinRT упаковываются в формат файлов .appx, а затем и .msix ; основанный на соглашениях об открытой упаковке , он использует формат ZIP с добавленными файлами XML. [15] Приложения WinRT распространяются в основном через магазин приложений под названием Microsoft Store , где пользователи могут приобретать и загружать приложения Windows (называемые приложениями Магазина Windows ). Первоначально приложения WinRT можно было загружать только из-за пределов Магазина Windows в системах Windows 8 или RT, которые являются частью домена Windows или оснащены специальным ключом активации, полученным от Microsoft. [16] [17] [18] [19] Однако эти ограничения были сняты в обновлении Windows от 10 ноября, где пользователи могут свободно загружать любое приложение, подписанное доверенным сертификатом, включив соответствующий параметр. [20]
В отличие от Win32 и, как и в .NET Framework 4.5 , большинство API, реализация которых, как ожидается, потребует значительного времени, реализованы как асинхронные. При вызове асинхронной функции среды выполнения Windows задача запускается в другом потоке или процессе, и функция немедленно завершает работу, освобождая приложение для выполнения других задач во время ожидания результатов. [21] Асинхронная модель требует новых конструкций языка программирования. Каждый язык предоставляет свой собственный способ использования асинхронных API. Части встроенного API, требующие асинхронного доступа, включают экранные сообщения и диалоги, доступ к файлам, подключение к Интернету, сокеты, потоки, устройства и службы, а также календарь, контакты и встречи.
Метаданные описывают API, написанные с использованием WinRT ABI. Он определяет модель программирования , которая позволяет писать объектно-ориентированный код, который можно использовать на разных языках программирования , и обеспечивает такие службы, как отражение .
Херб Саттер , эксперт по C++ в Microsoft , объяснил во время своей сессии по C++ на конференции Build 2011, что метаданные WinRT имеют тот же формат, что и метаданные CLI . [10] Собственный код (т. е. машинный код, специфичный для процессора) не может содержать метаданные, поэтому он хранится в отдельном файле метаданных, который может отображаться как обычные сборки CLI . [22] Поскольку это тот же формат, что и метаданные CLI, API WinRT можно использовать из управляемых языков CLI , как если бы это был просто API .NET.
WinRT имеет богатую объектно-ориентированную систему типов на основе классов , построенную на метаданных. Он поддерживает конструкции с соответствующими конструкциями в .NET framework: классы , методы , свойства , делегаты и события .
Одним из основных дополнений WinRT по сравнению с COM является межприложенный двоичный интерфейс (ABI), дженерики в стиле .NET . Только интерфейсы и делегаты могут быть универсальными, а классы времени выполнения и методы в них — нет. Общие интерфейсы также известны как параметризованные интерфейсы. В C++/CX они объявляются с использованием ключевого слова generic
с синтаксисом, очень похожим на синтаксис ключевого слова template
. Классы WinRT (ссылочные классы) также можно обобщить с помощью шаблонов C++, но в метаданные .winmd можно экспортировать только экземпляры шаблонов (с некоторым изменением имен ), в отличие от универсальных шаблонов WinRT, которые сохраняют свою универсальность в метаданных. WinRT также предоставляет набор интерфейсов для универсальных контейнеров , которые параллельны интерфейсам стандартной библиотеки C++ , а языки предоставляют некоторые функции взаимного (обратного) преобразования. Использование коллекций WinRT на языках .NET (например, C# и VB) и в JavaScript более прозрачно, чем в C++, при этом автоматические сопоставления с их естественными эквивалентами происходят «за кулисами». При разработке компонента WinRT на управляемом языке необходимо соблюдать некоторые дополнительные правила в стиле COM, например, типы коллекций платформы .NET не могут быть объявлены как возвращаемые типы, но на границе компонента можно использовать только интерфейсы WinRT, которые они реализуют.
Классы, скомпилированные для WinRT, называются компонентами WinRT . Это классы, которые можно написать на любом поддерживаемом языке и для любой поддерживаемой платформы. Ключевым моментом являются метаданные. Эти метаданные позволяют взаимодействовать с компонентом любого другого языка WinRT. Среда выполнения требует, чтобы компоненты WinRT, созданные с помощью .NET Framework, использовали определенные типы интерфейсов или интерфейсы типов .NET, которые автоматически сопоставляются с первым из названных. Наследование пока не поддерживается в управляемых компонентах WinRT, за исключением классов XAML. [23]
Программы и библиотеки, предназначенные для среды выполнения WinRT, можно создавать и использовать на нескольких платформах и языках программирования. В частности, C / C++ (либо с языковыми расширениями, обеспечивающими первоклассную поддержку концепций WinRT, либо с библиотекой шаблонов нижнего уровня, позволяющей писать код на стандартном C++), .NET ( C# и Visual Basic .NET (VB.NET)) и JavaScript . Это стало возможным благодаря метаданным. В терминологии WinRT языковая привязка называется языковой проекцией.
Стандартный C++ является первоклассным представителем платформы WinRT. Начиная с Windows 10 версии 1803, Windows SDK содержит C++/WinRT. C++/WinRT — это полностью стандартная современная проекция языка C++17 для API-интерфейсов среды выполнения Windows (WinRT), реализованная как библиотека на основе заголовочных файлов и предназначенная для обеспечения первоклассного доступа к современному API-интерфейсу Windows. С помощью C++/WinRT API среды выполнения Windows можно создавать и использовать с помощью любого совместимого со стандартами компилятора C++17. WinRT — это собственная платформа, поддерживающая любой собственный (и стандартный) код C++, поэтому разработчик C++ может повторно использовать существующие собственные библиотеки C/C++. В C++/WinRT нет языковых расширений.
Существует два других устаревших варианта использования WinRT из C++: библиотека шаблонов C++ среды выполнения Windows (WRL), библиотека шаблонов в стиле ATL (аналогичная библиотеке шаблонов Windows или WTL) и C++/CX (C++ с расширениями компонентов), напоминающая C++. /CLI. [24] Из-за внутренних требований к потреблению в Microsoft WRL не содержит исключений, что означает, что его дисциплина возвращаемых значений основана на HRESULT , как и в COM. [25] C++/CX, с другой стороны, оборачивает вызовы WinRT кодом, который выполняет проверку ошибок и при необходимости генерирует исключения. [26]
C++/CX имеет несколько расширений, обеспечивающих интеграцию с платформой и ее системой типов. Синтаксис напоминает синтаксис C++/CLI , хотя он создает собственный (хотя и не стандартный) код и метаданные, которые интегрируются со средой выполнения. Например, объекты WinRT могут быть выделены с помощью ref new
, который является аналогом gcnew
C++/CLI. Оператор шляпы ^
сохраняет свое значение, однако в случае, когда и вызывающая сторона, и вызываемая сторона написаны на C++ и находятся в одном и том же процессе, ссылка шляпы представляет собой просто указатель на vptr в таблицу виртуальных методов (vtable, VMT). [26]
Наряду с C++/CX, относительно традиционного COM-программирования на C++, существуют частичные классы , опять-таки вдохновленные .NET. Они позволяют транслировать экземпляр кода WinRT XAML в код C++ с помощью инструментов, а затем объединять его с кодом, написанным человеком, для создания полного класса, обеспечивая при этом чистое разделение сгенерированных машиной и отредактированных человеком частей реализации класса в разные файлы.
.NET Framework и среда Common Language Runtime (CLR) интегрированы в WinRT в качестве подплатформы. Он повлиял на экосистему и установил стандарты через формат метаданных и библиотеки. CLR предоставляет такие услуги, как JIT-компиляция кода и сборка мусора . Приложения WinRT, использующие языки .NET, используют WinUI на основе XAML и в основном написаны на C#, VB.NET и впервые для XAML с собственным кодом , использующим C++/CX. Хотя программы еще официально не поддерживаются, их также можно писать на других языках .NET. В .NET 5 Microsoft удалила встроенную поддержку WinRT и вместо этого создала CsWinRT, инструмент, который генерирует код взаимодействия для доступа к API-интерфейсам среды выполнения Windows, аналогично тому, как работает C++/WinRT. [27] [28]
Классы, определенные в компонентах WinRT, встроенных в управляемые языки .NET, должны быть объявлены как sealed
, чтобы их нельзя было получить из них. Однако незапечатанные классы WinRT, определенные где-либо еще, могут быть унаследованы из .NET, их виртуальные методы переопределены и т. д.; но унаследованный управляемый класс все равно должен быть запечатан.
Члены, которые взаимодействуют с другим языком, должны иметь подпись с типами WinRT или управляемый тип, который можно преобразовать в них. [23]
Приложения WinRT также можно кодировать с использованием HTML с JavaScript в коде программной части , которые запускаются с использованием механизма рендеринга Trident и механизма JavaScript Chakra , оба из которых также используются Internet Explorer . При кодировании приложения WinRT на JavaScript его функции адаптируются в соответствии с соглашениями об именах JavaScript, а пространства имен также сопоставляются с объектами JavaScript.
Microsoft находится в процессе проектирования API WinRT для языков, отличных от C++. Одним из примеров является Rust/WinRT, интерфейс для программ, написанных на Rust , для использования и создания API-интерфейсов WinRT. [29] Rust/WinRT является частью Windows App SDK (ранее Project Reunion), попытки Microsoft объединить традиционный рабочий стол Windows и модель приложений UWP. [30]
С появлением универсальной платформы Windows (UWP) платформа получила множество мостов API, которые позволяют легко переносить программы, изначально разработанные для других платформ, используя при этом преимущества функций UWP. Microsoft предоставила мосты для Android (несуществующих с 2016 года), iOS ( Cocoa Touch ), Progressive Web Apps , Silverlight , а также традиционных настольных приложений Windows (с использованием пакета MSIX из Windows App SDK ).
WinRT поставляется с интерфейсом прикладного программирования (API) в виде библиотеки классов , которая предоставляет разработчику функции Windows 8, такие как API иммерсивного интерфейса. Он доступен и доступен для использования на любом поддерживаемом языке.
Классы среды выполнения Windows — это набор пакетов SDK, которые обеспечивают доступ ко всем функциям — от анализатора XAML до функции камеры. SDK реализованы как собственные библиотеки C/C++ (неуправляемые).
На соглашения об именах компонентов (классов и других членов) в API сильное влияние оказывают соглашения об именах .NET, в которых используется верблюжий регистр (в частности, PascalCase). Microsoft рекомендует пользователям следовать этим правилам в случае, если не указаны другие.
Эти соглашения проецируются по-разному в некоторых языках, например в JavaScript, который преобразует их в свои соглашения и наоборот. Это должно обеспечить естественное и единообразное взаимодействие независимо от языка программирования.
Поскольку среда выполнения Windows рассчитана на различные языки, существуют некоторые ограничения на основные типы данных, позволяющие поддерживать все такие языки. Программистам следует быть осторожными с поведением этих типов при использовании с открытым доступом (для параметров метода, возвращаемых значений метода, свойств и т. д.). [31]
Number
может представлять точность до 53 бит.null
. Это связано с тем, что ключевое слово JavaScript null
представлено как нулевой объект. Аналогичные результаты возникают при переходе undefined
к WinRT из JavaScript.+=
оператора.addEventListener
функция или on<EventName>
свойство настройки используются для подписки на события.<Verb>[<Noun>]Async
: . В полной библиотеке времени выполнения все методы, которые могут длиться более 50 мс, реализуются только как асинхронные методы.Windows Phone 8.1 использует версию среды выполнения Windows, называемую Windows Phone Runtime . Он позволяет разрабатывать приложения на C# и VB.NET, а также компоненты среды выполнения Windows на C++/CX. [32] Хотя поддержка WP8 была ограниченной, платформа в конечном итоге объединилась с Windows 8.1 в Windows Phone 8.1 .
Windows Phone 8 имеет ограниченную поддержку разработки и использования компонентов среды выполнения Windows через среду выполнения Windows Phone . Многие из API-интерфейсов среды выполнения Windows в Windows 8, которые обрабатывают основные функции операционной системы, были перенесены в Windows Phone 8. [33] По запросу индустрии разработки игр была добавлена поддержка разработки собственных игр с использованием C++/CX и DirectX.
Однако платформа XAML для Windows Phone по-прежнему основана на той же платформе Microsoft Silverlight , что и в Windows Phone 7, для обеспечения обратной совместимости. Таким образом, по состоянию на 2016 год [обновлять]разработка XAML на C++/CX невозможна. Разработка с использованием HTML5 или WinJS не поддерживается в Windows Phone 8.
Поддержка среды выполнения Windows в Windows Phone 8.1 аналогична Windows 8.1. Этот выпуск добавляет на платформу полный API среды выполнения Windows, включая поддержку WinRT XAML и привязки языков для C++/CX и HTML5 — JavaScript . Существует также тип проекта под названием « Универсальные приложения» , позволяющий приложениям совместно использовать код в версиях Windows Phone и Windows 8.1.
Была обновлена платформа Windows Phone 8 Silverlight Framework. [ когда? ] Он может использовать некоторые новые функции среды выполнения Windows.
Среда выполнения Windows Phone использует формат пакета AppX из Windows 8 после использования Silverlight XAP .
Чтобы включить загрузку неопубликованных приложений на компьютере с Windows 8 Корпоративная, который не присоединен к домену, или на любом компьютере с Windows® 8 Pro, необходимо использовать ключ активации продукта для неопубликованной загрузки.
Чтобы включить загрузку неопубликованных приложений на устройстве Windows® RT, необходимо использовать ключ активации продукта для неопубликованных приложений.
Дополнительные сведения о загрузке неопубликованных ключей активации продукта см. в разделе Корпоративное лицензирование Microsoft.