Перенос в универсальную платформу Windows (C++)

В этом разделе приведены сведения о переносе существующего кода C++ на платформу приложений Windows, универсальная платформа Windows. Что означает универсальный термин, заключается в том, что код может выполняться на любом из устройств под управлением Windows 10 или более поздней версии. Вы создаете один проект и один базовый пользовательский интерфейс XAML, который хорошо работает на любом устройстве под управлением Windows 10 или более поздней версии. Чтобы пользовательский интерфейс приложения мог адаптироваться к дисплеям разного размера, можно использовать средства динамического макета в XAML.

В состав документации центра разработчиков Windows входит руководство по переносу приложений Windows 8.1 в универсальную платформу Windows. См. раздел Перенос приложения из среды выполнения Windows 8 в UWP. Хотя в этом руководстве основное внимание уделено коду на C#, большинство рекомендаций и инструкций применимо и к C++. Следующие процедуры содержат более подробные сведения. См. также переход с классического приложения на UWP.

В этом разделе рассматриваются следующие процедуры переноса кода в UWP.

То же самое можно сделать при наличии классической DLL-библиотеки Win32, которую требуется вызывать из приложения UWP. С помощью таких процедур можно создать уровень пользовательского интерфейса UWP для существующего классического приложения Windows на языке C++ или кроссплатформенного стандартного кода C++. См. Практическое руководство. Использование существующего кода C++ в приложении универсальной платформы Windows.

Перенос приложения для магазина Windows 8.1 на UWP

Если у вас есть приложение Магазина Windows 8.1, эту процедуру можно использовать для работы с UWP и любого устройства под управлением Windows 10 или более поздней версии. Рекомендуется сначала создать проект с помощью Visual Studio 2019 в качестве проекта Windows 8.1, чтобы сначала устранить все проблемы, возникающие из-за изменений в компиляторе и библиотеках. После этого существует два способа преобразования этого в проект Windows UWP. Самый простой способ (как поясняется в следующей процедуре) — создание универсального проекта Windows и копирование в него существующего кода. Если вы использовали универсальный проект для классического приложения Windows 8.1 и Windows Phone 8.1, то проект будет запускаться с двумя разными макетами в XAML. Однако на выходе вы получите один динамический макет, адаптирующийся под размер экрана.

Перенос приложения для магазина Windows 8.1 на UWP

  1. Если вы еще не осуществили перенос, откройте свой проект приложения Windows 8.1 в Visual Studio 2017 и выполните процедуру обновления файла проекта.

    Необходимо установить средства Windows 8.1 в Visual Studio. Если эти средства не установлены, запустите программу установки Visual Studio в окне Программы и компоненты, выберите Visual Studio 2017 и в окне программы установки нажмите Изменить. Найдите средства Windows 8.1, убедитесь, что они выделены, и нажмите кнопку ОК.

  2. Откройте окно Свойства проекта и в области C++>Общие установите для набора инструментов платформы значение v141, указывающее набор инструментов для Visual Studio 2017.

  3. Постройте проект как проект Windows 8.1, а затем исправьте все ошибки сборки. Как правило, на этом этапе ошибки связаны с критическими изменениями в средствах сборки и библиотеках. Подробное описание изменений, которые могут повлиять на код, см. в статье Журнал изменений Visual C++ 2003–2015.

    После очистки сборки проекта вы сможете перенести его в универсальная платформа Windows.

  4. Создайте новый проект универсального приложения Windows с помощью пустого шаблона. Ему можно присвоить имя, совпадающее с именем существующего проекта. Но в этом случае проекты должны находиться в разных каталогах.

  5. Закройте решение, а затем с помощью проводника Windows или командной строки скопируйте файлы кода (с расширениями .cpp, .h и .xaml) из проекта Windowsс8.1 в ту же папку, что и файл проекта (.vcxproj) для проекта, созданного на шаге 1. Не копируйте файл Package.appxmanifest. Если у вас есть отдельный код для Windows 8.1 Desktop и Windows 8.1 Phone, выберите один из них для переноса в первую очередь (позже вам придется выполнить ряд действий, чтобы подготовить перенос другого кода). Не забудьте скопировать все вложенные папки и их содержимое. При появлении соответствующего запроса выберите вариант замены всех файлов с одинаковыми именами.

  6. Снова откройте решение и выберите пункты Добавить>Существующий элемент в контекстном меню для узла проекта. Выберите все файлы, которые были скопированы, за исключением файлов, которые уже являются частью проекта.

    Проверьте все вложенные папки и убедитесь, что в них также добавлены файлы.

  7. Если вы используете имя проекта, которое отличается от имени старого проекта, откройте файл Package.appxmanifest и обновите точку входа в соответствии с именем пространства имен для класса App.

    Поле Точка входа в файле Package.appxmanifest содержит имя области для класса App, содержащего пространство имен, которое содержит класс App. При создании универсального проекта Windows для пространства имен указывается имя проекта. Если оно отличается от имени, указанного в файлах, скопированных из старого проекта, обновите одно из них, чтобы они соответствовали друг другу.

  8. Постройте проект и устраните все ошибки сборки из-за критических изменений между различными версиями пакета Windows SDK.

  9. Запустите проект на локальном компьютере. Убедитесь, что отсутствуют ошибки развертывания, что макет приложения имеет приемлемый формат и что он корректно работает на настольном компьютере.

  10. Если у вас есть отдельные файлы кода .xaml для другого устройства, например, для Windows Phone 8.1, проанализируйте этот код и найдите в нем отличия от кода для стандартного устройства. Если разница заключается только в макете, для настройки отображения, в зависимости от размера экрана, можно использовать диспетчер визуальных состояний в xaml. Если имеются другие различия, можно использовать разделы условий в коде с помощью следующих операторов #if.

    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
    #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
    

    Эти операторы могут применяться соответственно к приложениям UWP, приложениям Магазина Windows Phone, к обоим видам приложений или ни к одному из них (то есть, только к классическим приложениям Win32). Эти макросы доступны только в пакете SDK Windows 8.1 и более поздних версиях. Поэтому если код должен компилироваться в более ранних версиях пакета SDK Windows или для других платформ, помимо Windows, необходимо учитывать ситуацию, в которой не определена ни одна их этих возможностей.

  11. Запустите приложение и выполните его отладку в эмуляторе или физическом устройстве для каждого типа устройств, поддерживаемого приложением. Чтобы запустить эмулятор, Visual Studio необходимо запустить на физическом компьютере, а не на виртуальной машине.

Перенос компонента среды выполнения Windows 8.1 на UWP

Если у вас есть библиотека DLL или компонент среда выполнения Windows, который уже работает с приложениями Магазина Windows 8.1, эту процедуру можно использовать для получения компонента или библиотеки DLL, работающих с UWP в Windows. Процедура в целом заключается в создании нового проекта и копировании в него кода.

Перенос компонента среды выполнения Windows 8.1 в UWP

  1. В диалоговом окне Новый проект в Visual Studio 2017 найдите узел Универсальное приложение для Windows . Если этот узел не отображается, сначала установите пакет SDK для Windows. Выберите шаблон компонента среды выполнения Windows , присвойте компоненту имя и нажмите кнопку ОК . Имя компонента будет использоваться в качестве имени пространства имен, поэтому вы можете использовать имя пространства имен старого проекта. Для этого потребуется создать проект в папке, которая отличается от папки старого проекта. Если выбрать другое имя, можно обновить имя пространства имен в созданных файлах кода.

  2. Закройте проект.

  3. Скопируйте все файлы кода (CPP, H, XAML и т. д.) из компонента Windows 8.1 в только что созданный проект. Не копируйте файл Package.appxmanifest.

  4. Выполните сборку и устраните все ошибки, возникающие из-за критических изменений между разными версиями пакета SDK Windows.

Устранение неполадок

В процессе портирования кода на платформу UWP могут возникать различные ошибки. Могут возникать следующие проблемы.

Проблемы с конфигурацией проекта

Может появиться такое сообщение об ошибке.

could not find assembly 'platform.winmd': please specify the assembly search path using /AI or by setting the LIBPATH environment variable

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

<AppContainerApplication>true</AppContainerApplication>
<ApplicationType>Windows Store</ApplicationType>
<WindowsTargetPlatformVersion>10.0.10156.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformMinVersion>10.0.10156.0</WindowsTargetPlatformMinVersion>
<ApplicationTypeRevision>10.0</ApplicationTypeRevision>

Если вы создали новый проект UWP в Visual Studio, эта ошибка не появится.

См. также

Visual C++: руководство по переносу
Разработка приложений для универсальной платформы Windows (UWP)