Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
C++/WinRT — это полностью стандартная современная проекция языка C++17 для API среды выполнения Windows (WinRT), реализованная в виде библиотеки на основе заголовков и предназначенная для обеспечения доступа к современному API Windows. С помощью C++/WinRT можно создавать и использовать API среды выполнения Windows с помощью любого компилятора C++17, совместимого со стандартами. Пакет SDK для Windows включает C++/WinRT; она появилась в версии 10.0.17134.0 (Windows 10 версии 1803).
C++/WinRT — это рекомендуемая замена языка C++/CX, а библиотека шаблонов C++ среды выполнения Windows (WRL). Полный список тем о C++/WinRT включает информацию как о взаимодействии с, так и о портировании из C++/CX и WRL.
Это важно
Некоторые из наиболее важных элементов C++/WinRT, которые следует учитывать, описаны в разделах: поддержка пакета SDK для C++/WinRT и поддержка Visual Studio для C++/WinRT, XAML, расширения VSIX и пакета NuGet.
См. также Где можно найти примеры приложений C++/WinRT?.
Проекции языка
Среда выполнения Windows основана на API объектной модели компонентов (COM) и предназначена для доступа через проекции языка. Проекция скрывает сведения COM и обеспечивает более естественный интерфейс программирования для заданного языка.
Проекция языка C++/WinRT в справочном содержимом API среды выполнения Windows
При просмотре API среды выполнения Windowsщелкните поле со списком язык в правом верхнем углу и выберите C++/WinRT, чтобы просмотреть блоки синтаксиса API, как они отображаются в проекции языка C++/WinRT.
Поддержка Visual Studio для C++/WinRT, XAML, расширения VSIX и пакета NuGet
Для поддержки Visual Studio вам потребуется Visual Studio 2022 или Visual Studio 2019 или Visual Studio 2017 (по крайней мере версия 15.6; рекомендуется по крайней мере 15.7). В установщике Visual Studio установите компонент разработки для универсальной платформы Windows . В сведения об установке>универсальной платформы Windowsпроверьте опции средства универсальной платформы Windows C++ (версии 14x), если вы еще этого не сделали. А в разделе Параметры>Конфиденциальность и безопасность (Windows 10: Обновление и безопасность) >Для разработчиков, включите режим разработчика (Windows 10: не параметр Загрузка неопубликованных приложений).
Хотя рекомендуется разрабатывать с помощью последних версий Visual Studio и пакета SDK для Windows, Если вы используете версию C++/WinRT, которая поставляется с пакетом SDK для Windows до 10.0.0.17763.0 (Windows 10 версии 1809), то для использования заголовков пространств имен Windows, упомянутых выше, вам потребуется минимальная целевая версия пакета SDK для Windows в проекте 10.0.17134.0 (Windows 10, версия 1803).
Visual Studio 2022 поставляется с встроенными шаблонами проектов и элементов C++/WinRT, чтобы сразу начать разработку C++/WinRT. Он также включает нативную визуализацию отладки (natvis) для проектируемых типов C++/WinRT в Visual Studio, обеспечивая возможности, аналогичные отладке C#. Natvis является автоматическим для отладочных сборок. Дополнительную информацию см. в разделе "Средства визуализации отладки в среде Visual Studio для собственных проектов на C++/WinRT".
Для более старых версий Visual Studio необходимо скачать и установить последнюю версию расширения Visual Studio C++/WinRT (VSIX) из Visual Studio Marketplace.
- Расширение VSIX предоставляет шаблоны проектов и элементов C++/WinRT в Visual Studio.
- Кроме того, он предоставляет собственное средство визуализации отладки в Visual Studio (natvis) для проектируемых типов C++/WinRT.
Шаблоны проектов Visual Studio для C++/WinRT описаны в следующих разделах. При создании проекта C++/WinRT с последней версией установленного расширения VSIX новый проект C++/WinRT автоматически устанавливает пакет NuGet Microsoft.Windows.CppWinRT. Пакет NuGet Microsoft.Windows.CppWinRT предоставляет поддержку сборки C++/WinRT (свойства и целевые объекты MSBuild), что делает проект переносимым между компьютером разработки и агентом сборки (на котором установлен только пакет NuGet, а не расширение VSIX).
Кроме того, можно преобразовать существующий проект, вручную установив пакет NuGet Microsoft.Windows.CppWinRT. После установки (или обновления до) последней версии расширения VSIX откройте существующий проект в Visual Studio, щелкните Project>Manage NuGet Packages...>Обзор, введите или вставьте Microsoft.Windows.CppWinRT в поле поиска, выберите элемент в результатах поиска и щелкните Установить, чтобы установить пакет для этого проекта. После добавления пакета вы получите поддержку C++/WinRT MSBuild для проекта, включая вызов средства cppwinrt.exe
.
Это важно
Если у вас есть проекты, созданные с (или обновленные для работы с) версией расширения VSIX, выпущенной раньше версии 1.0.190128.4, см. более ранние версии расширения VSIX. В этом разделе содержатся важные сведения о конфигурации проектов, которые необходимо знать, чтобы обновить их, чтобы использовать последнюю версию расширения VSIX.
- Так как C++/WinRT использует функции из стандарта C++17, пакет NuGet задает свойство проекта языка C/C++>язык>C++ уровня "Стандартный">СТАНДАРТ ISO C++17 (/std:c++17) в Visual Studio.
- Он также добавляет параметр компилятора /bigobj.
- Он добавляет параметр компилятора /await, чтобы включить
co_await
. - Он указывает компилятору XAML выдавать кодеген C++/WinRT.
- Также может потребоваться задать режим соответствия : Да (/permissive-), что дополнительно ограничивает код соответствием стандартам.
- Другим свойством проекта является C/C++>Общие>рассматривать предупреждения как ошибки. Установите это значение на Да (/WX) или Нет (/WX-) по вкусу. Иногда исходные файлы, созданные средством
cppwinrt.exe
, создают предупреждения, пока не добавите к ним реализацию.
При настройке системы, как описано выше, вы сможете создавать и создавать или открывать проект C++/WinRT в Visual Studio и развертывать его.
По состоянию на версию 2.0 пакет NuGet Microsoft.Windows.CppWinRT включает средство cppwinrt.exe
. Вы можете указать средство cppwinrt.exe
в файле метаданных среды выполнения Windows (.winmd
) для создания стандартной библиотеки C++ на основе заголовков, проектов API, описанных в метаданных для использования из кода C++/WinRT. Файлы метаданных среды выполнения Windows (.winmd
) предоставляют канонический способ описания поверхности API среды выполнения Windows. Указывая cppwinrt.exe
на метаданные, вы можете создать библиотеку для использования с любым классом среды выполнения, реализованным во втором или стороннем компоненте среды выполнения Windows или реализованном в собственном приложении. Дополнительные сведения см. в статье Использование API с C++/WinRT.
С помощью C++/WinRT можно также реализовать собственные классы среды выполнения с помощью стандартного C++, не прибегая к программированию в стиле COM. Для класса времени выполнения вы просто описываете свои типы в файле IDL, а midl.exe
и cppwinrt.exe
создают типовые файлы исходного кода реализации для вас. Кроме того, можно просто реализовать интерфейсы, производные от базового класса C++/WinRT. Дополнительные сведения см. в статье Авторские API с помощью C++/WinRT.
Для получения списка параметров настройки для средства cppwinrt.exe
, заданных с помощью свойств проекта, см. readme пакета NuGet Microsoft.Windows.CppWinRT .
Вы можете определить проект, использующий поддержку C++/WinRT MSBuild, по наличию в проекте установленного пакета NuGet Microsoft.Windows.CppWinRT.
Ниже приведены шаблоны проектов Visual Studio, предоставляемые расширением VSIX.
Пустое приложение (C++/WinRT)
Шаблон проекта для приложения универсальной платформы Windows (UWP), имеющего пользовательский интерфейс XAML.
Visual Studio предоставляет поддержку компилятора XAML для создания заглушек реализации и заголовков на основе файла языка определения интерфейсов (IDL) (.idl
), который располагается за каждым файлом разметки XAML. В файле IDL определите все классы локальной среды выполнения, которые вы хотите использовать на страницах XAML вашего приложения, а затем единожды соберите проект, чтобы создать шаблоны реализации в Generated Files
и определения типов заглушек в Generated Files\sources
. Затем используйте эти определения типов-заглушек в качестве ссылки для реализации ваших локальных классов исполнения. См. разбиение классов времени выполнения на Midl-файлы (.idl).
Поддержка поверхности для проектирования XAML в Visual Studio для C++/WinRT почти достигла уровня C#. В Visual Studio можно использовать вкладку "События ", окна "Свойства " для добавления обработчиков событий в проект C++/WinRT. Вы также можете добавить обработчики событий в код вручную. Дополнительные сведения см. в разделе Обработка событий с помощью делегатов в C++/WinRT.
Основное приложение (C++/WinRT)
Шаблон проекта для приложения универсальной платформы Windows (UWP), который не использует XAML.
Вместо этого он использует заголовок пространства имен Windows C++/WinRT для пространства имен Windows.ApplicationModel.Core. После создания и запуска щелкните пустое пространство, чтобы добавить цветной квадрат; затем щелкните цветной квадрат, чтобы перетащить его.
Консольное приложение Windows (C++/WinRT)
Шаблон проекта для клиентского приложения C++/WinRT для Windows Desktop с пользовательским интерфейсом консоли.
Настольное приложение Windows (C++/WinRT)
Шаблон проекта для клиентского приложения C++/WinRT для Рабочего стола Windows, который отображает Windows.Foundation.Uri в MessageBox Win32.
Компонент среды выполнения Windows (C++/WinRT)
Шаблон проекта для компонента; обычно для использования из универсальной платформы Windows (UWP).
Этот шаблон демонстрирует цепочку инструментов midl.exe
>cppwinrt.exe
, где метаданные среды выполнения Windows (.winmd
) создаются из IDL, а затем реализации и заглушки заголовков создаются из метаданных среды выполнения Windows.
В файле IDL определите классы среды выполнения в компоненте, их интерфейс по умолчанию и любые другие интерфейсы, которые они реализуют. Создайте проект один раз, чтобы сгенерировать module.g.cpp
, module.h.cpp
, шаблоны реализации в Generated Files
и определения типов заглушек в Generated Files\sources
. Затем используйте эти определения типа заглушки для ссылки на реализацию классов среды выполнения в компоненте. См. разбиение классов времени выполнения на Midl-файлы (.idl).
Объедините скомпилированный двоичный файл компонента среды выполнения Windows и его .winmd
с приложением UWP, которое их использует.
Более ранние версии расширения VSIX
Рекомендуем установить (или обновить до) последнюю версию расширения VSIX. По умолчанию он настроен на автоматическое обновление. Если это сделать, и у вас есть проекты, созданные с версией расширения VSIX до версии 1.0.190128.4, в этом разделе содержатся важные сведения об обновлении этих проектов для работы с новой версией. Если вы не обновляете, то сведения в этом разделе по-прежнему будут полезны.
С точки зрения поддерживаемых версий Windows SDK и Visual Studio, а также конфигурации Visual Studio, информация из раздела о поддержке Visual Studio для C++/WinRT, XAML, расширения VSIX и пакета NuGet, приведенная выше в, применяется к более ранним версиям расширения VSIX. В приведенной ниже информации описываются важные различия в поведении и настройке проектов, созданных с более ранними версиями (или обновленными для работы с ними).
Создано ранее 1.0.181002.2
Если проект был создан с версией расширения VSIX ранее 1.0.181002.2, поддержка сборки C++/WinRT была встроена в ту версию расширения VSIX. В вашем проекте установлено свойство <CppWinRTEnabled>true</CppWinRTEnabled>
в файле .vcxproj
.
<Project ...>
<PropertyGroup Label="Globals">
<CppWinRTEnabled>true</CppWinRTEnabled>
...
Вы можете обновить проект вручную, установив пакет NuGet Microsoft.Windows.CppWinRT. После установки (или обновления до) последней версии расширения VSIX откройте проект в Visual Studio, щелкните Project>Manage NuGet Packages...>Обзор, введите или вставьте Microsoft.Windows.CppWinRT в поле поиска, выберите элемент в результатах поиска и щелкните Установить, чтобы установить пакет для проекта.
Создан или обновлён на версии от 1.0.181002.2 до 1.0.190128.3
Если ваш проект был создан с версией расширения VSIX от 1.0.181002.2 до 1.0.190128.3 включительно, то пакет NuGet Microsoft.Windows.CppWinRT был автоматически установлен в проект шаблоном проекта. Возможно, вы также обновили старый проект, чтобы использовать версию расширения VSIX в этом диапазоне. Если вы сделали это, то, так как поддержка сборки также присутствует в версиях расширения VSIX в этом диапазоне, обновленный проект может или не был установлен пакет NuGet microsoft.Windows.CppWinRT.
Чтобы обновить проект, следуйте инструкциям в предыдущем разделе и убедитесь, что у вашего проекта установлен пакет NuGet microsoft.Windows.CppWinRT.
Недопустимые конфигурации обновления
Последняя версия расширения VSIX не допускает, чтобы проект имел свойство <CppWinRTEnabled>true</CppWinRTEnabled>
без установленного пакета NuGet Microsoft.Windows.CppWinRT . Проект с этой конфигурацией создает сообщение об ошибке сборки: "VSIX C++/WinRT больше не предоставляет поддержку сборки проекта. Добавьте ссылку на проект в пакет Nuget Microsoft.Windows.CppWinRT".
Как уже упоминалось выше, в проекте C++/WinRT теперь должен быть установлен пакет NuGet.
Так как элемент <CppWinRTEnabled>
теперь устарел, вы можете при желании изменить .vcxproj
и удалить элемент. Это не обязательно, но это вариант.
Кроме того, если .vcxproj
содержит <RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>
, ее можно удалить, чтобы можно было выполнить сборку, не требуя установки расширения VSIX C++/WinRT.
Поддержка пакета SDK для C++/WinRT
Хотя в настоящее время он присутствует только по соображениям совместимости, начиная с версии 10.0.17134.0 (Windows 10 версии 1803), пакет SDK для Windows содержит стандартную библиотеку C++ на основе заголовков для использования интерфейсов API Windows (API среды выполнения Windows в пространствах имен Windows). Эти заголовки находятся в папке %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt
. Начиная с Windows SDK версии 10.0.17763.0 (Windows 10, версии 1809), эти заголовки создаются для вас внутри папки вашего проекта $(GeneratedFilesDir).
Снова для обеспечения совместимости пакет SDK для Windows также поставляется с инструментом cppwinrt.exe
. Однако мы рекомендуем вместо этого установить и использовать последнюю версию cppwinrt.exe
, которая входит в состав пакета NuGet Microsoft.Windows.CppWinRT. Этот пакет и cppwinrt.exe
описаны в приведенных выше разделах.
Пользовательские типы в проекции C++/WinRT
В программировании C++/WinRT можно использовать стандартные функции языка C++ и типы данных C++ уровня "Стандартный" и C++/WinRT, включая некоторые типы данных стандартной библиотеки C++. Однако вы также узнаете о некоторых пользовательских типах данных в проекции и можете выбрать их использование. Например, мы используем winrt::hstring в примере кода быстрого запуска в начало работы с C++/WinRT.
winrt::com_array — это другой тип, который вы, вероятно, будете использовать в какой-то момент. Но вы менее склонны напрямую использовать тип, например winrt::array_view. Или вы можете не использовать его таким образом, чтобы у вас не было кода для изменения, если и когда эквивалентный тип отображается в стандартной библиотеке C++.
Предупреждение
Существуют также типы, которые можно увидеть, если вы внимательно изучаете заголовки пространства имен Windows C++/WinRT. Примером является winrt::param::hstring, но существуют также примеры коллекций. Они существуют исключительно для оптимизации привязки входных параметров, и они обеспечивают большие улучшения производительности и делают большинство вызовов шаблонов "просто работой" для связанных стандартных типов и контейнеров C++. Эти типы используются проекцией только в тех случаях, когда они приносят наибольшую ценность. Они очень оптимизированы, и они не используются для общего использования; не заманчиво использовать их самостоятельно. Не следует использовать что-либо из пространства имен winrt::impl
, так как они являются типами реализаций и поэтому подлежат изменению. Вы должны продолжать использовать стандартные типы или типы из пространства имен winrt.
См. также передачу параметров через границу ABI.