Что такое WinRT и с чем его едят?

264
25 января 2018, 16:33

Рихтер в своей книге целую главу посвятил данному механизму, но я так и не понял в каких сценариях его имеет смысл применять.

Это что-то типа убийцы COM, который нужно применять для межязыкового взаимодействия между управляемым модулем и неуправляемым? Или это вообще какая-то обертка над WinApi?

Answer 1

На самом деле, WinRT не является заменой или оберткой для какой либо из предыдущих технологий. WinRT - это принципиально новая технология, направленная на разработку приложений, которые имеют смысл на разных типах устройств. Приложение WinRT может использовать базовый API и работать на всех типах устройств, или использовать расширения API и работать под набором конкретных устройств (например, под ПК и смартфоном, ПК и Xbox и т.п.)

Первоначально эта технология возникла под Windows 8 и называлась WinRT. Позднее в Windows 10 она была заменена на аналогичную технологию UWP, которая охватывает больший набор устройств. Сейчас можно приближенно считать, что это одно и то же.

Приложения UWP/WinRT обладают следующими особенностями:

  • Взаимодействие с ОС с помощью специального API Windows Runtime или ограниченного подмножества разрешенных API из Win32/COM и .NET
  • Запуск в ограниченной среде, где приложения не имеют прямой доступ к оборудованию, реестру, всей файловой системе и т.п. WinRT приложения имеют доступ только к своей папке данных, а к другим папкам могут получать доступ с явного разрешения пользователя
  • Распространение преимущественно через Магазин Windows, подобно распространению мобильных приложений, в противоположность обычному скачиванию инсталляторов с разных сайтов
  • Разработка может осуществляться либо на С++ (с расширениями С++/CX для взаимодействия с компонентами WinRT), либо на .NET-языках
  • Построение графического интерфейса с помощью XAML-фреймворка, похожего на WPF. В отличие от WPF, приложение строится не как набор окон, а как набор страниц, между которыми пользователь переходит внутри одного окна (как в веб-приложениях). Это позволяет создавать адаптивный интерфейс, имеющий смысл на разных типах устройств.

WinRT не является "убийцей COM", что бы это не значило. COM жив и будет жить, более того, сами компоненты WinRT API внутри представляют из себя COM-объекты. WinRT-приложения, написанные на С++, могут взаимодействовать с ними либо традиционно, как с COM-объектами, либо с использованием специальных расширений языка C++/CX.

WinRT не является "убийцей WinAPI", что бы это не значило. WinRT приложения, написанные на С++, могут как обычно взаимодействовать с подмножеством разрешенных Win32/COM API. Например, функция CreateFile будет доступна, а функции работы с реестром - нет. Конечно, это не позволяет обойти ограничения платформы, т.е. функция CreateFile также будет работать только с файлами в разрешенных папках. Забавный факт: в WinRT нельзя этой функцией открыть устройство NUL, как следствие - код, написанный из предположения, что оно всегда доступно, сломается при портировании под WinRT.

WinRT не является средством для организации взаимодействия между управляемым и неуправляемым кодом (в целом). Тем не менее, расширения языка C++/CX предоставляют возможность организовать взаимодействие между кодом на стандартном С++ и компонентами WinRT.

Подробнее: Введение в работу с UWP приложениями

READ ALSO
Помогите написать программу в C# [требует правки]

Помогите написать программу в C# [требует правки]

ПриветПомогите написать программу в C#

353
Конвертация char в Virtual-Key Code для unicode

Конвертация char в Virtual-Key Code для unicode

Необходимо передать WM_KEYDOWN через SendMessage, имея unicode char независимо от выбранной пользователем раскладки клавиатуры в конкретное окно

193
Как добавить в visual studio 2015 вывод дебажной информации в самом редакторе?

Как добавить в visual studio 2015 вывод дебажной информации в самом редакторе?

Как добавить показ дебажной информации в Visual Studio 2015 непосредственно в редакторе кода а не в отдельной панелиХотелось бы как например а Intelij...

266
Синтезатор своей речи C#

Синтезатор своей речи C#

Как написать синтезатор, который вместо встроенных голосов будет использовать мой собственный?

199