stringtranslate.com

Среда выполнения Windows

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. Среда выполнения требует, чтобы компоненты WinRT, созданные с помощью .NET Framework, использовали определенные типы интерфейсов или интерфейсы типов .NET, которые автоматически сопоставляются с первыми названными. Наследование пока не поддерживается в управляемых компонентах WinRT, за исключением классов XAML. [23]

Интерфейсы программирования

Программы и библиотеки, предназначенные для среды выполнения WinRT, могут создаваться и использоваться с нескольких платформ и языков программирования. В частности, C / C++ (либо с языковыми расширениями, предлагающими первоклассную поддержку концепций WinRT, либо с низкоуровневой библиотекой шаблонов, позволяющей писать код на стандартном C++), .NET ( C# и Visual Basic (.NET) (VB.NET)) и JavaScript . Это стало возможным благодаря метаданным. В терминологии WinRT языковая привязка называется языковой проекцией.

C++ (C++/WinRT, расширения компонентов, WRL)

Стандартный 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]

JavaScript

Приложения 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 ).

API

WinRT поставляется с интерфейсом прикладного программирования (API) в форме библиотеки классов , которая раскрывает возможности Windows 8 для разработчика, такие как API иммерсивного интерфейса. Он доступен и может использоваться из любого поддерживаемого языка.

Классы времени выполнения

Классы Windows Runtime — это набор SDK, которые предоставляют доступ ко всем функциям от парсера XAML до функции камеры. SDK реализованы как собственные библиотеки C/C++ (неуправляемые).

Соглашения об именовании

Соглашения об именовании компонентов (классов и других членов) в API во многом зависят от соглашений об именовании .NET, которые используют camelcase (в частности PascalCase). Microsoft рекомендует пользователям следовать этим правилам в случае, если не указано иное.

Эти соглашения проецируются по-разному в некоторых языках, например, JavaScript, который преобразует их в свои соглашения и наоборот. Это делается для того, чтобы обеспечить родной и последовательный опыт независимо от языка программирования.

Ограничения и правила

Поскольку Windows Runtime проецируется на различные языки, существуют некоторые ограничения на фундаментальные типы данных, чтобы разместить все такие языки. Программисты должны быть осторожны с поведением этих типов при использовании с открытым доступом (для параметров методов, возвращаемых значений методов, свойств и т. д.). [31]

Основные типы
В языках .NET и C++ существует богатый набор типов данных, представляющих различные числа.
В JavaScript a Numberможет представлять точность не более 53 бит.
В WinRT единственным отсутствующим числовым типом данных является 8-битное знаковое целое число по сравнению с .NET и C++. Разработчики JavaScript должны быть осторожны при работе с большими числами при кодировании для WinRT.
Струны
Строки неизменяемы в .NET и JavaScript, но изменяемы в C++.
Нулевой указатель, переданный как строка в WinRT с помощью C++, преобразуется в пустую строку
В .Net значение null, передаваемое в WinRT как строка, преобразуется в пустую строку
В JavaScript null, передаваемый в качестве строки в WinRT, преобразуется в строку со словом null. Это связано с тем, что ключевое слово JavaScript nullпредставлено как объект null. Аналогичные результаты возникают при передаче undefinedв WinRT из JavaScript.
Структуры
В .NET и C++ структуры являются типами значений, и такая структура может содержать в себе любой тип.
JavaScript не поддерживает структуры напрямую.
В WinRT использование структур разрешено только для содержащихся типов, имеющих семантику значений, включая числа, строки и другие структуры. Указатели или ссылки на интерфейсы запрещены.
Ссылки
В .NET объекты передаются по ссылке, тогда как числа и структуры передаются по значению.
В C++ все типы могут передаваться по ссылке или по значению.
В WinRT интерфейсы передаются по ссылке; все остальные типы могут передаваться либо по значению, либо по ссылке. [2]
Массивы
В .NET, C++ и JavaScript массивы являются ссылочными типами.
В WinRT массивы являются типами значений и весьма ограничены.
События
В .NET и C++ клиенты подписываются на события с помощью +=оператора.
В JavaScript для подписки на события используется addEventListenerфункция или свойство настройки .on<EventName>
В WinRT все языки могут использовать свой собственный способ подписки на события.
Коллекции
Некоторые коллекции .NET напрямую сопоставляются с коллекциями WinRT.
Тип WinRT Vector напоминает массивы, и для их использования используется синтаксис массива.
Тип карты WinRT представляет собой коллекцию пар ключ/значение и проецируется как словарь в языках .NET.
Перегрузка метода
Все языки WinRT (.NET, C++, JavaScript) поддерживают перегрузку параметров.
.NET и C++ также поддерживают перегрузку типа.
В WinRT для перегрузки используется только номер параметра.
Асинхронность
Все методы WinRT спроектированы таким образом, что любой метод, выполнение которого занимает более 50 миллисекунд, является асинхронным методом.
Установленный шаблон именования для различения асинхронных методов — <Verb>[<Noun>]Async. Для полной библиотеки времени выполнения все методы, которые могут длиться дольше 50 мс, реализуются только как асинхронные методы.

Среда выполнения Windows Phone

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 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 Phone 8.1

Поддержка 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 .

Ссылки

  1. ^ Чжан, И (15 марта 2017 г.). «Windows Runtime is not a Runtime». Блог yizhang82 . Получено 14 июня 2021 г.
  2. ^ ab Аврам, Абель (21 сентября 2011 г.). «Подробности проектирования среды выполнения Windows». InfoQ .
  3. ^ Клуг, Брайан; Смит, Райан (13 сентября 2011 г.). «Сборка Microsoft: Windows 8, предварительная бета-версия». AnandTech .
  4. ^ ab Michael, Mayberry (2012). WinRT Revealed . Нью-Йорк: Apress . стр. 3. ISBN 978-1-4302-4585-8.
  5. ^ "Создание приложений Win32 (C++)". MSDN . Microsoft . Получено 12 января 2014 г. .
  6. ^ "Файлы метаданных Windows (WinMD)". Справочник API для приложений UWP. Microsoft Docs . Получено 20 июля 2019 г.
  7. Де Икаса, Мигель (15 сентября 2011 г.). «WinRT демистифицируется». Личный блог Мигеля де Икаса . Самостоятельно опубликовано . Проверено 15 января 2014 г.
  8. ^ "WINMD Files Under the Hood". CodeProject . 15 октября 2012 г. Получено 14 июня 2021 г.
  9. ^ «Каковы накладные расходы на маршалинг COM при вызове WinRT API из C#?». Форум MSDN . Самостоятельно опубликовано . 20 сентября 2011 г. Получено 15 января 2014 г.
  10. ^ ab "Использование среды выполнения Windows из C++ | Build2011 | Channel 9". Channel9.msdn.com. 14 сентября 2011 г. Архивировано из оригинала 12 октября 2011 г. Получено 24 апреля 2012 г.
  11. ^ Sivakumar, Nish (29 сентября 2011 г.). "Visual C++ и WinRT/Metro - Некоторые основы - CodeProject®". Codeproject.com . Получено 24 апреля 2012 г. .
  12. ^ "Использование среды выполнения Windows из C++ | Build2011 | Channel 9". Channel9.msdn.com. 14 сентября 2011 г. Архивировано из оригинала 12 октября 2011 г. Получено 24 апреля 2012 г.
  13. ^ "Введение в C++/WinRT — приложения Windows UWP". docs.microsoft.com . Microsoft.
  14. ^ lastnameholiu. "Разрешения на доступ к файлам - приложения UWP". docs.microsoft.com . Получено 8 августа 2020 г. .
  15. ^ "Designing a simple and secure app package – APPX". Блог разработчиков приложений для Windows 8. Получено 30 декабря 2013 г.
  16. ^ "Как добавлять и удалять приложения". TechNet . Microsoft. 31 мая 2012 г. Получено 4 октября 2012 г. Чтобы включить загрузку приложений на компьютере с Windows 8 Enterprise, не присоединенном к домену, или на любом компьютере с Windows® 8 Pro, необходимо использовать ключ активации продукта для загрузки приложений. Чтобы включить загрузку приложений на устройстве с Windows® RT, необходимо использовать ключ активации продукта для загрузки приложений. Дополнительные сведения о ключах активации продукта для загрузки приложений см. в разделе Microsoft Volume Licensing.
  17. ^ "Windows 8: The Metro Mess". PC Magazine. Архивировано из оригинала 18 ноября 2018 г. Получено 8 сентября 2012 г.
  18. ^ "Microsoft теперь использует термин "Modern UI Style" для обозначения приложений Windows 8 в стиле "Metro"" . Получено 10 августа 2012 г.
  19. ^ «Что такое приложение Microsoft Store?». Центр разработки Windows . Получено 1 октября 2012 г.
  20. ^ "Что такое Sideloading и как загружать приложения из сторонних источников в Windows 10? [ПОДРОБНОСТИ]". Silicophilic . 27 июля 2019 г. . Получено 14 июня 2021 г. .
  21. ^ "Асинхронное программирование (приложения Магазина Windows)". MSDN . Microsoft . Получено 12 января 2014 г. .
  22. ^ ".NET получает новую жизнь". Архивировано из оригинала 24 сентября 2011 г. Получено 16 сентября 2011 г.
  23. ^ ab "Использование среды выполнения Windows из C# и Visual Basic | Build2011 | Channel 9". Channel9.msdn.com. 14 сентября 2011 г. Получено 24 апреля 2012 г.
  24. ^ "Внутри C++/CX Design - Блог команды Visual C++ - Главная страница сайта - Блоги MSDN". Blogs.msdn.com. 20 октября 2011 г. Получено 24 апреля 2012 г.
  25. Charles (26 октября 2011 г.). "GoingNative 3: The C++/CX Episode with Marian Luparu | C9::GoingNative | Channel 9". Channel9.msdn.com. Архивировано из оригинала 7 мая 2012 г. Получено 24 апреля 2012 г.
  26. ^ ab Под капотом C++ для приложений в стиле Metro с Деоном Брюисом на //Build
  27. ^ "CSWinRT: Как вызывать API Windows WinRT из приложений .NET5". TECHCOMMUNITY.MICROSOFT.COM . 22 сентября 2020 г. . Получено 14 июня 2021 г. .
  28. ^ Mayberry, Michael (2012), «Создание приложения .NET с помощью WinRT», WinRT Revealed , Беркли, Калифорния: Apress, стр. 29–46, doi :10.1007/978-1-4302-4585-8_3, ISBN 978-1-4302-4584-1, получено 14 июня 2021 г.
  29. ^ "microsoft/winrt-rs". GitHub . 28 сентября 2021 г.
  30. ^ "microsoft/WindowsAppSDK: Windows App SDK расширяет возможности всех приложений Windows Desktop с помощью современного пользовательского интерфейса Windows, API и функций платформы, включая поддержку обратной совместимости, поставляемых через NuGet". GitHub . Получено 12 октября 2021 г. .
  31. ^ "Десять советов по написанию гибридного приложения в стиле Metro - Build2011 - Channel 9". Channel 9 . Microsoft.
  32. ^ "Справочник по API Windows Phone". Справочник по API Windows Phone . Microsoft . 21 июля 2014 г.
  33. ^ "Windows Phone Runtime API". microsoft.com . Microsoft.

Внешние ссылки