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

Среда выполнения Windows
Другие именаWinRT
Разработчики)Microsoft
Операционная системаМайкрософт Виндоус
ПредшественникWin32 API
ТипИнтерфейс прикладного программирования
Интернет сайтmsdn.microsoft.com/ en-US/ окна/Программы/ Отредактируйте это в Викиданных

Среда выполнения Windows (WinRT) - это архитектура приложений, не зависящая от платформы, впервые представленная в Windows 8 и Windows Server 2012 в 2012 году. WinRT поддерживает разработку в C ++ / WinRT (стандартный C ++), C ++ / CX (Расширения компонентов, язык, основанный на C ++ ), Rust / WinRT, JavaScript -Машинопись, а управляемый код языки C # и Visual Basic .NET (VB.NET). Приложения WinRT изначально поддерживают как x86 и РУКА процессоров, и может работать внутри в песочнице окружающая среда, обеспечивающая большую безопасность и стабильность.[1][2] Компоненты WinRT разработаны с учетом возможности взаимодействия между множеством языков и API, включая собственные, управляемые языки и языки сценариев.

Windows Phone 8.1 использует версию среды выполнения Windows под названием Среда выполнения Windows Phone. Он позволяет разрабатывать приложения на C # и VB.NET, а компоненты среды выполнения Windows - на C ++ / CX.[3]

Технологии

WinRT реализован на языке программирования C ++[4] и является объектно-ориентированный по дизайну.[4] Его основная технология, Windows API (Win32 API), в основном написан на языке C.[5] Это неуправляемый код интерфейс прикладного программирования (API) на основе Компонентная объектная модель (COM), который позволяет взаимодействовать с несколькими языками, как и COM. Однако определения API хранятся в .winmd файлы, которые закодированы в Метаданные ECMA 335 формат, который .NET Framework также используется с некоторыми модификациями.[6][7][ненадежный источник? ] Этот общий формат метаданных позволяет значительно снизить накладные расходы при вызове WinRT из приложений .NET по сравнению с P / Invoke и гораздо более простой синтаксис.[8][ненадежный источник? ]

Новый C ++ / CX (Component Extensions) язык, который заимствует некоторые C ++ / CLI синтаксис, был введен для написания и использования компонентов WinRT с меньшими затратами клей код видимый для программиста по сравнению с классическим программированием COM на C ++ и налагает меньше ограничений по сравнению с C ++ / CLI на смешивание типов. Расширения компонентов C ++ / CX рекомендуются для использования только на границе API, а не для других целей.[9] Обычный C ++ (со спецификой COM) также можно использовать для программирования с компонентами WinRT,[10] с помощью библиотеки шаблонов C ++ среды выполнения Windows (WRL), которая по назначению аналогична той, что Библиотека активных шаблонов предусматривает COM.[11] В 2019 году Microsoft отказалась от C ++ / CX в пользу C ++ / WinRT библиотека заголовков.[12]

Приложения WinRT запускаются в изолированной программной среде и требуют явного одобрения пользователя для доступа к критически важным функциям ОС и базовому оборудованию. По умолчанию доступ к файлам ограничен несколькими заранее определенными местоположениями, такими как каталоги «Документы» или «Изображения».[13]

Приложения WinRT для Windows RT, Windows 8 и более поздних версий упакованы в .appx формат файла; основанный на Соглашения об открытой упаковке, он использует Формат ZIP с добавленными файлами XML.[14] Приложения WinRT распространяются в основном через магазин приложений названный Магазин Microsoft, где программное обеспечение WinRT (называемое Приложения Магазина Windows) могут быть загружены и приобретены пользователями. Приложения WinRT могут быть загруженный из-за пределов Магазина Windows в системах Windows 8 или RT, которые являются частью Домен Windows, или оснащен специальным ключом активации, полученным от Microsoft.[15][16][17][18]

В значительной степени отличается от Win32 и аналогично .NET Framework 4.5, большинство API, выполнение которых, как ожидается, займет много времени, реализованы как асинхронный. Приложение отправляет вызов API, который немедленно возвращается, освобождая приложение для выполнения других задач в ожидании результатов.[19] Асинхронная модель требует новых конструкций языка программирования (ключевое слово асинхронный и оператор Ждите в C # и Visual Basic, класс задача и метод .тогда в C ++, которые предоставляются WinRT комплект для разработки программного обеспечения (SDK), класс Обещать и метод .тогда в JavaScript-HTML5), аналогично пытаться/ловить используется в Обработка исключений. Части API, требующие асинхронного доступа, включают экранные сообщения и диалоги, доступ к файлам, подключение к Интернету, сокеты, потоки, устройства и службы, а также календарь, контакты и встречи.

Услуги

Метаданные

Метаданные описывают код, написанный для платформы WinRT. Он определяет модель программирования что позволяет писать объектно-ориентированный код, которым можно поделиться языки программирования, и включает такие услуги, как отражение.

Херб Саттер, C ++ эксперт в Microsoft, объяснил во время своего сеанса по C ++ на конференции 2011 г. Построить конференцию что метаданные WinRT имеют тот же формат, что и Метаданные CLI.[9] Собственный код (т.е. машинный код для конкретного процессора) не может содержать метаданные, поэтому он хранится в отдельных WINMD-файлах, которые могут быть отражены как обычные Сборки CLI.[20]

Поскольку это метаданные интерфейса командной строки, код, написанный на собственных языках WinRT, можно использовать из управляемого Языки интерфейса командной строки.

Система типов

WinRT имеет богатую объектно-ориентированный учебный класс -основан система типов который построен на метаданных. Он поддерживает конструкции с соответствующими конструкциями в .NET framework: классы, методы, характеристики, делегаты, и События.

Одним из основных дополнений WinRT по сравнению с COM является перекрестныйдвоичный интерфейс приложения (ABI), в стиле .NET дженерики. В C ++ / CX они объявляются с помощью ключевого слова общий с синтаксисом, очень похожим на синтаксис ключевого слова шаблон. Классы 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.[21]

Программные интерфейсы

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

В терминологии WinRT языковая привязка называется языковая проекция.

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

Собственный C ++ - это первоклассный гражданин платформы WinRT. Начиная с версии 10.0.17134.0 (Windows 10, версия 1803) Windows SDK содержит C ++ / WinRT. C ++ / WinRT - это полностью стандартная современная языковая проекция C ++ 17 для API-интерфейсов среды выполнения Windows (WinRT), реализованная в виде библиотеки на основе заголовочного файла и предназначенная для предоставления первоклассного доступа к современному Windows API. С помощью C ++ / WinRT API среды выполнения Windows можно создавать и использовать с помощью любого совместимого со стандартами компилятора C ++ 17. WinRT является собственной платформой и поддерживает любой собственный (и стандартный) код C ++, так что разработчик C ++ может повторно использовать существующие собственные библиотеки C / C ++. В C ++ / WinRT нет языковых расширений.

До того, как C ++ / WinRT был официально выпущен в Windows SDK с октября 2016 года,[22] Microsoft предложила на GitHub C ++ / WinRT.[23] Он не полагается на код C ++ / CX, что приводит к созданию меньших двоичных файлов и более быстрого кода.[24]

Есть два других устаревших варианта использования WinRT из C ++: WRL, библиотека шаблонов в стиле ATL и C ++ / CX (C ++ с расширениями компонентов), который напоминает C ++ / CLI.[25] Из-за требований к внутреннему потреблению в Microsoft WRL не содержит исключений, а это означает, что его дисциплина возврата HRESULT -на основе, как у COM.[26] C ++ / CX, с другой стороны, завершает вызовы WinRT кодом, который выполняет проверку ошибок и при необходимости выдает исключения.[27]

C ++ / CX имеет несколько расширений, которые обеспечивают интеграцию с платформой и ее системой типов. Синтаксис напоминает синтаксис C ++ / CLI хотя он производит собственный (хотя и не стандартный) код и метаданные, которые интегрируются со средой выполнения. Например, объекты WinRT могут быть выделены с помощью ref новый, который является аналогом gcnew из C ++ / CLI. Оператор шляпы ^ сохраняет свое значение, однако в случае, когда и вызывающий, и вызываемый написаны на C ++ и живут в одном процессе, ссылка на шляпу - это просто указатель на vptr на таблица виртуальных методов (vtable, VMT).[27]

Наряду с C ++ / CX, по сравнению с традиционным программированием COM на C ++, существуют частичные классы, снова вдохновленный .NET. Это разрешить экземпляр XAML код, который должен быть переведен в код C ++ с помощью инструментов, а затем объединен с кодом, написанным человеком, для создания полного класса, позволяя при этом четко разделить сгенерированные машиной и редактируемые человеком части реализации класса в разные файлы.

.СЕТЬ

В .NET Framework и общеязыковая среда выполнения (CLR) интегрированы в WinRT в качестве подплатформы. Он повлиял и установил стандарты для экосистемы через формат метаданных и библиотеки. CLR предоставляет такие услуги, как JIT-компиляция код и вывоз мусора. Приложения WinRT, использующие языки .NET, используют новый Платформа XAML среды выполнения Windows, и в основном написаны на C #, VB.NET и впервые для XAML с собственный код с использованием C ++ / CX. Хотя это еще не официально поддерживается, программы также могут быть написаны на других языках .NET.

Ограничения

Классы, определенные в компонентах WinRT, построенных на управляемых языках .NET, должны быть объявлены как запечатанный, поэтому они не могут быть получены из. Однако незапечатанные классы WinRT, определенные где-то еще, могут быть унаследованы от .NET, их виртуальные методы переопределены и т. Д .; но унаследованный управляемый класс по-прежнему должен быть запечатан.

Члены, которые взаимодействуют с другим языком, должны иметь подпись с типами WinRT или управляемым типом, который может быть преобразован в них.[21]

JavaScript

Приложения WinRT также можно кодировать с помощью HTML с JavaScript в код программной части, которые запускаются с помощью Трезубец движок рендеринга и Чакра Движок JavaScript, оба из которых также используются Internet Explorer. При кодировании приложения WinRT на JavaScript его функции адаптированы для соблюдения соглашений об именах JavaScript, а пространства имен также сопоставляются с объектами JavaScript.

Другие языки

Microsoft находится в процессе проектирования API WinRT для языков, отличных от C ++. Одним из примеров является Rust / WinRT, интерфейс для программ, написанных на Ржавчина использовать WinRT API.[28] Rust / WinRT является частью Project Reunion, попытки Microsoft согласовать платформы Win32 и WinRT.[29]

Мосты

С введением Универсальная платформа Windows (UWP) WinRT получил множество мостов API, которые позволяют легко переносить программы, изначально написанные для других языков, используя преимущества функций UWP. Microsoft предоставила мосты для Android (не существует с 2016 года), iOS (Какао Touch ), Прогрессивные веб-приложения, Silverlight, а также стандартные настольные приложения на базе Win32 (с использованием пакета MSIX от Project Reunion).

API

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

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

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

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

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

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

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

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

Основные типы
В языках .NET и C ++ существует богатый набор типов данных, представляющих различные числа.
В JavaScript Число может представлять только до 53 бит точности.
В WinRT отсутствует единственный числовой тип данных - это 8-битное целое число со знаком относительно .NET и C ++. Разработчики JavaScript должны быть осторожны, имея дело с большими числами при написании кода для WinRT.
Струны
Строки неизменяемы в .NET и JavaScript, но изменчивы в C ++.
Нулевой указатель, переданный C ++ в WinRT в виде строки, преобразуется в пустую строку.
В .Net значение null, передаваемое в WinRT в виде строки, преобразуется в пустую строку.
В JavaScript значение null, передаваемое в WinRT в виде строки, преобразуется в строку со словом ноль. Это связано с ключевым словом JavaScript ноль представлен как нулевой объект. Подобные результаты возникают при прохождении неопределенный в WinRT из JavaScript.
Структуры
В .NET и C ++ структуры являются типами значений, и такая структура может содержать любой тип.
JavaScript не поддерживает структуры напрямую.
В WinRT использование структур разрешено только для типов, имеющих семантику значений, включая числа, строки и другие структуры. Указатели или ссылки на интерфейс запрещены.
Рекомендации
В .NET объекты передаются по ссылке, а числа и структуры передаются по значению.
В C ++ все типы могут передаваться по ссылке или по значению.
В WinRT интерфейсы передаются по ссылке; все остальные типы передаются по значению.
Массивы
В .NET, C ++ и JavaScript массивы являются ссылочными типами.
В WinRT массивы являются типами значений.
События
В .NET и C ++ клиенты подписываются на события, используя += оператор.
В JavaScript addEventListener функция или настройка на свойство используется для подписки на события.
В WinRT все языки могут использовать собственный способ подписки на события.
Коллекции
Некоторые коллекции .NET отображаются непосредственно в коллекции WinRT.
WinRT Вектор type похож на массивы, и для их использования используется синтаксис массива.
WinRT карта type - это коллекция пар ключ / значение, которая на языках .NET проектируется как словарь.
Перегрузка метода
Все языки WinRT (.NET, C ++, JavaScript) поддерживают перегрузку параметров
.NET и C ++ также поддерживают перегрузку по типу.
В WinRT для перегрузки используется только номер параметра.
Асинхронность
Все методы WinRT разработаны таким образом, что любой метод, занимающий более 50 миллисекунд, является асинхронным.
Установленный шаблон именования для различения асинхронных методов: [] Асинхронный. Для полной библиотеки времени выполнения все методы, которые могут длиться дольше 50 мс, реализованы только как асинхронные методы.

История версий

Версия для Windows
Windows 8Среда выполнения Windows
Windows 8.1
Windows 10Универсальная платформа Windows (UWP)

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

Начиная с Windows Phone 8 можно разрабатывать приложения, используя версию среды выполнения Windows, называемую Среда выполнения Windows Phone (WPRT). Хотя WP8 обеспечил ограниченную поддержку, платформа в конечном итоге сошлась с Windows 8.1 в Windows Phone 8.1.

Windows Phone 8

Windows Phone 8 имеет ограниченную поддержку разработки и использования компонентов среды выполнения Windows через Среда выполнения Windows Phone. Многие из API среды выполнения Windows в Windows 8, которые обрабатывают основные функции операционной системы, были перенесены на Windows Phone 8.[31] Поддержка разработки собственных игр с использованием C ++ / CX и DirectX была добавлена ​​по запросу от индустрии разработки игр.

Однако платформа XAML для Windows Phone по-прежнему основана на том же Microsoft Silverlight framework, как в Windows Phone 7, для обратной совместимости. Таким образом, по состоянию на 2016 г., Разработка XAML невозможна в C ++ / CX. Разработка с использованием HTML5 или WinJS не поддерживается в Windows Phone 8.

Windows Phone 8.1

Поддержка среды выполнения Windows в Windows Phone 8.1 совпадает с Windows 8.1. Этот выпуск предоставляет платформу полный API среды выполнения Windows, включая поддержку Платформа XAML среды выполнения Windows и языковые привязки для C ++ / CX, и HTML5 -JavaScript. Также существует тип проекта под названием Универсальные приложения чтобы приложения могли совместно использовать код в версиях Windows Phone и Windows 8.1.

Обновлена ​​платформа Windows Phone 8 Silverlight Framework.[когда? ] Он может использовать некоторые новые функции среды выполнения Windows.

Среда выполнения Windows Phone использует AppX формат пакета из Windows 8 после предыдущего использования Silverlight XAP.

Смотрите также

Рекомендации

  1. ^ Аврам, Авель (21 сентября 2011 г.). «Детали разработки среды выполнения Windows». InfoQ.
  2. ^ Клуг, Брайан; Смит, Райан (13 сентября 2011 г.). «Сборка Microsoft: Windows 8, предварительная бета-версия». АнандТех.
  3. ^ «Справочник по Windows Phone API». Справочник по Windows Phone API. Microsoft. 21 июля 2014 г.
  4. ^ а б Майкл, Мэйберри (2012). Раскрытие WinRT. Нью-Йорк: Apress. п. 3. ISBN  978-1-4302-4585-8.
  5. ^ «Создание приложений Win32 (C ++)». MSDN. Microsoft. Получено 12 января 2014.
  6. ^ "Файлы метаданных Windows (WinMD)". Справочник по API для приложений UWP. Документы Microsoft. Получено 2019-07-20.
  7. ^ Де Икаса, Мигель (15 сентября 2011 г.). "Демистификация WinRT". Личный блог Мигеля де Икасы. Самостоятельно опубликованный. Получено 15 января 2014.
  8. ^ «Каковы накладные расходы на маршалинг COM при вызове WinRT API из C #?». Форум MSDN. Самостоятельно опубликованный. 20 сентября 2011 г.. Получено 15 января 2014.
  9. ^ а б «Использование среды выполнения Windows из C ++ | Build2011 | Channel 9». Channel9.msdn.com. 2011-09-14. Получено 2012-04-24.
  10. ^ Сивакумар, Ниш (29 сентября 2011 г.). «Visual C ++ и WinRT / Metro - Некоторые основы - CodeProject®». Codeproject.com. Получено 2012-04-24.
  11. ^ «Использование среды выполнения Windows из C ++ | Build2011 | Channel 9». Channel9.msdn.com. 2011-09-14. Получено 2012-04-24.
  12. ^ «Введение в C ++ / WinRT - приложения Windows UWP». docs.microsoft.com. Microsoft.
  13. ^ lastnameholiu. «Разрешения на доступ к файлам - приложения UWP». docs.microsoft.com. Получено 2020-08-08.
  14. ^ «Разработка простого и безопасного пакета приложений - APPX». Блог разработчика приложений для Windows 8. Получено 30 декабря 2013.
  15. ^ «Как добавлять и удалять приложения». TechNet. Microsoft. 31 мая 2012 года. Получено 4 октября 2012. Чтобы разрешить загрузку неопубликованных приложений на компьютере с Windows 8 Enterprise, который не присоединен к домену, или на любом компьютере с Windows® 8 Pro, необходимо использовать ключ активации продукта для загрузки неопубликованных приложений. Чтобы разрешить загрузку неопубликованных приложений на устройстве Windows® RT, необходимо использовать ключ активации продукта для загрузки неопубликованных приложений. Дополнительные сведения о загрузке неопубликованных ключей активации продукта см. В разделе Корпоративное лицензирование Microsoft.
  16. ^ "Windows 8: Беспорядок в метро". Журнал ПК. Получено 8 сентября 2012.
  17. ^ «Microsoft теперь использует 'Modern UI Style' для обозначения приложений Windows 8 'Metro Style'». Получено 10 августа 2012.
  18. ^ "Что такое приложение Microsoft Store?". Центр разработки для Windows. Получено 1 октября 2012.
  19. ^ «Асинхронное программирование (приложения Windows Store)». MSDN. Microsoft. Получено 12 января 2014.
  20. ^ ".NET получает новую жизнь". Архивировано из оригинал 24 сентября 2011 г.. Получено 16 сентября, 2011.
  21. ^ а б «Использование среды выполнения Windows из C # и Visual Basic | Build2011 | Channel 9». Channel9.msdn.com. 2011-09-14. Получено 2012-04-24.
  22. ^ «Первоначальный предварительный выпуск C ++ / WinRT». github.com. 2016-10-05. Получено 2016-10-05.
  23. ^ «C ++ / WinRT - это стандартная проекция языка C ++ для среды выполнения Windows». github.com. 2016-09-14. Получено 2016-09-14.
  24. ^ «Стандартный C ++ и среда выполнения Windows (C ++ / WinRT)». blogs.windows.com. 2016-11-28. Получено 2016-11-28.
  25. ^ "Внутри C ++ / CX Design - Блог группы разработчиков Visual C ++ - Домашняя страница сайта - Блоги MSDN". Blogs.msdn.com. 2011-10-20. Получено 2012-04-24.
  26. ^ Чарльз (2011-10-26). "GoingNative 3: Эпизод C ++ / CX с Марианом Лупару | C9 :: GoingNative | Channel 9". Channel9.msdn.com. Получено 2012-04-24.
  27. ^ а б Под крышками с C ++ для приложений в стиле Metro с Деоном Брюисом в // Build
  28. ^ "microsoft / winrt-rs". GitHub.
  29. ^ «microsoft / ProjectReunion: эволюция платформы для разработчиков Windows, которая сделает ее более совместимой, гибкой, современной и открытой». GitHub.
  30. ^ «Десять советов при написании приложения в стиле Metro на гибридном языке - Build2011 - Channel 9». Канал 9. Microsoft.
  31. ^ «API среды выполнения Windows Phone». microsoft.com. Microsoft.

внешняя ссылка