Windows Runtime ( 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] Это неуправляемый двоичный интерфейс приложения , основанный на Component Object Model (COM), который позволяет взаимодействовать с несколькими языками, как и COM. Однако определения API хранятся в файлах .winmd
, которые закодированы в формате метаданных ECMA 335 , который .NET Framework также использует с некоторыми изменениями. Для компонентов WinRT, реализованных в машинном коде, файл метаданных содержит только определения методов, классов, интерфейсов и перечислений, а реализация предоставляется в отдельной DLL. [6] [7] [8] Этот общий формат метаданных упрощает использование API WinRT из приложений .NET с более простым синтаксисом, чем P/Invoke . [9] [ ненадежный источник? ] Windows предоставляет набор встроенных API, созданных на основе WinRT ABI, которые предоставляют все, от библиотеки WinUI на основе XAML до доступа к устройствам, таким как камера, микрофон и т. д.
Предыдущий язык C++/CX (Component Extensions), который заимствует часть синтаксиса C++/CLI , был введен для написания и использования компонентов WinRT с меньшим количеством видимого программисту связующего кода по сравнению с классическим программированием COM на C++ и налагает меньше ограничений по сравнению с C++/CLI на смешивание типов. Component Extensions C++/CX рекомендуется использовать только на границе API, а не для других целей. [10] Обычный C++ (со специфической для COM дисциплиной) также может использоваться для программирования с компонентами WinRT, [11] с помощью библиотеки шаблонов C++ среды выполнения Windows (WRL), которая по своему назначению аналогична тому, что предоставляет библиотека Active Template Library для COM. [12] В 2019 году Microsoft отказалась от C++/CX в пользу библиотеки заголовков C++/WinRT . [13]
Большинство приложений WinRT работают в песочнице и требуют явного одобрения пользователя для доступа к критически важным функциям ОС и базовому оборудованию. По умолчанию доступ к файлам ограничен несколькими предопределенными расположениями, такими как каталоги Documents или Pictures. [14]
Приложения WinRT упаковываются в файлы формата .appx, а позднее в .msix ; на основе Open Packaging Conventions он использует формат ZIP с добавленными XML-файлами. [15] Приложения WinRT распространяются в основном через магазин приложений под названием Microsoft Store , где приложения Windows (называемые приложениями Windows Store ) могут быть приобретены и загружены пользователями. Первоначально приложения WinRT могли быть загружены только извне Windows Store на системы Windows 8 или RT, которые являются частью домена Windows или оснащены специальным ключом активации, полученным от Microsoft. [16] [17] [18] [19] Однако эти ограничения были сняты в обновлении Windows November 10 Update, где пользователи могут свободно загружать любое приложение, подписанное доверенным сертификатом, включив соответствующий параметр. [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 Framework не могут быть объявлены как возвращаемые типы, а на границе компонента могут использоваться только реализуемые ими интерфейсы 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 Runtime (WinRT), реализованная в виде библиотеки на основе заголовочных файлов и разработанная для предоставления первоклассного доступа к современному API Windows. С помощью C++/WinRT API Windows Runtime можно создавать и использовать с помощью любого соответствующего стандартам компилятора C++17. WinRT — это собственная платформа, поддерживающая любой собственный (и стандартный) код C++, так что разработчик C++ может повторно использовать существующие собственные библиотеки C/C++. С помощью C++/WinRT нет никаких языковых расширений.
Есть еще два устаревших варианта использования WinRT из C++: Windows Runtime C++ Template Library (WRL), библиотека шаблонов в стиле ATL (похожая на Windows Template Library или 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. Оператор hat ^
сохраняет свое значение, однако в случае, когда и вызывающий, и вызываемый написаны на C++ и находятся в одном процессе, ссылка hat — это просто указатель на vptr для таблицы виртуальных методов (vtable, VMT). [26]
Наряду с C++/CX, относительно традиционного программирования C++ COM, существуют частичные классы , снова вдохновленные .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 в code-behind , которые запускаются с использованием движка рендеринга Trident и движка JavaScript Chakra , оба из которых также используются Internet Explorer . При кодировании приложения WinRT на JavaScript его функции адаптируются для следования соглашениям об именовании JavaScript, а пространства имен также сопоставляются с объектами JavaScript.
Microsoft находится в процессе проектирования WinRT API на языки, отличные от C++. Одним из примеров является Rust/WinRT, интерфейс для программ, написанных на Rust, для использования и создания WinRT API. [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 Runtime — это набор SDK, которые предоставляют доступ ко всем функциям от парсера XAML до функции камеры. SDK реализованы как собственные библиотеки C/C++ (неуправляемые).
Соглашения об именовании компонентов (классов и других членов) в API во многом зависят от соглашений об именовании .NET, которые используют camelcase (в частности PascalCase). Microsoft рекомендует пользователям следовать этим правилам в случае, если не указано иное.
Эти соглашения проецируются по-разному в некоторых языках, например, JavaScript, который преобразует их в свои соглашения и наоборот. Это делается для того, чтобы обеспечить родной и последовательный опыт независимо от языка программирования.
Поскольку Windows Runtime проецируется на различные языки, существуют некоторые ограничения на фундаментальные типы данных, чтобы разместить все такие языки. Программисты должны быть осторожны с поведением этих типов при использовании с открытым доступом (для параметров методов, возвращаемых значений методов, свойств и т. д.). [31]
Number
может представлять точность не более 53 бит.null
. Это связано с тем, что ключевое слово JavaScript null
представлено как объект null. Аналогичные результаты возникают при передаче undefined
в WinRT из JavaScript.+=
оператора.addEventListener
функция или свойство настройки .on<EventName>
<Verb>[<Noun>]Async
. Для полной библиотеки времени выполнения все методы, которые могут длиться дольше 50 мс, реализуются только как асинхронные методы.Windows Phone 8.1 использует версию Windows Runtime, называемую Windows Phone Runtime . Она позволяет разрабатывать приложения на C# и VB.NET, а также компоненты Windows Runtime на C++/CX. [32] Хотя WP8 принес ограниченную поддержку, платформа в конечном итоге сблизилась с Windows 8.1 в Windows Phone 8.1 .
Windows Phone 8 имеет ограниченную поддержку разработки и использования компонентов Windows Runtime через Windows Phone Runtime . Многие API Windows Runtime в Windows 8, которые обрабатывают основные функции операционной системы, были перенесены в Windows Phone 8. [33] Поддержка разработки собственных игр с использованием C++/CX и DirectX была добавлена по запросу индустрии разработки игр.
Однако Windows Phone XAML Framework по-прежнему основан на том же фреймворке Microsoft Silverlight , что и в Windows Phone 7, для обратной совместимости. Таким образом, по состоянию на 2016 год [обновлять]разработка XAML невозможна в C++/CX. Разработка с использованием HTML5 или WinJS не поддерживается в Windows Phone 8.
Поддержка Windows Runtime в Windows Phone 8.1 совпадает с Windows 8.1. Выпуск приносит полный Windows Runtime API на платформу, включая поддержку WinRT XAML и языковые привязки для C++/CX и HTML5 - JavaScript . Существует также тип проекта под названием Universal apps , позволяющий приложениям совместно использовать код в версиях 8.1 Windows Phone и Windows.
Windows Phone 8 Silverlight Framework был обновлен. [ когда? ] Он может использовать некоторые новые функции в среде выполнения Windows.
Windows Phone Runtime использует формат пакета AppX из Windows 8, ранее использовавший Silverlight XAP .
Чтобы включить загрузку приложений на компьютере с Windows 8 Enterprise, не присоединенном к домену, или на любом компьютере с Windows® 8 Pro, необходимо использовать ключ активации продукта для загрузки приложений. Чтобы включить загрузку приложений на устройстве с Windows® RT, необходимо использовать ключ активации продукта для загрузки приложений. Дополнительные сведения о ключах активации продукта для загрузки приложений см. в разделе Microsoft Volume Licensing.