Синхронизация SDK с обновлением Windows 10 и использование WinRT со стандартным C++
Я начал экспериментировать с C++/WinRT, используя Visual Studio 2017 Community Edition. Теперь у меня есть среда, в которой я могу создать отладочную версию примера приложения и запустить его. Мне пришлось:
- загрузить и установить последнюю версию Windows 10 SDK
- обновить Visual Studio 2017 с помощью пакета C++/WinRT и шаблонов
- обновить ОС Windows 10 до последней сборки, сборка 1803
В документации и на веб-страницах рассказывалось об обновлении пакета C++/WinRT до Visual Studio, и попытка компилировать пример вызвала ошибку, указывающую на загрузку и установку последней версии Windows 10 SDK.
Когда я попытался запустить отладочную версию примера приложения, я обнаружил, что мне также нужна Windows 10 Build 1803.
Является ли Windows 10 Build 1803 требованием для запуска приложения с использованием Stadard C++ и C++/WinRT, или мой опыт связан с использованием сборки Debug?
Означает ли это, что люди, которые не обновили свою установку Windows 10 хотя бы до Windows 10 Build 1803, не смогут запустить приложение, разработанное с использованием C++/WinRT?
Возможно ли, что корпоративный или корпоративный клиент решит исключить необходимые компоненты C++/WinRT, когда он выполнит обновление для конкретного предприятия со своих собственных серверов с собственным набором обновлений, так что приложение C++/WinRT не сможет работать в их среда?
Есть ли какая-то упаковка, чтобы необходимые компоненты C++/WinRT могли быть включены в приложение?
Приложение: два тестовых приложения
Я попробовал с нуля два тестовых приложения, с которыми работал. Эта попытка повторяется после внесения изменений в установку последней версии Windows 10 SDK 10.0.17134, установку расширения C++/WinRT Visual Studio и обновление моего ПК до Windows 10 1803.
Первым приложением C++/WinRT, которое я попробовал, было консольное приложение из статьи Кенни Керра, C++ - Представляем C++/WinRT, в котором был следующий пример приложения:
#pragma comment(lib, "windowsapp")
#include "winrt/Windows.Foundation.h"
#include "winrt/Windows.Web.Syndication.h"
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
int main()
{
initialize(); // NOTE: Generates compiler error C3861: 'initialize': identifier not found
Uri uri(L"http://kennykerr.ca/feed");
SyndicationClient client;
SyndicationFeed feed = client.RetrieveFeedAsync(uri).get();
for (SyndicationItem item : feed.Items())
{
hstring title = item.Title().Text();
printf("%ls\n", title.c_str());
}
}
Наконец, я разработал процедуру создания, компиляции и запуска этого тестового источника следующим образом. Начиная с открытия Visual Studio 2017 Community Edition, я сделал следующее:
- Файл -> Создать -> Проектировать и использовать Windows Desktop, шаблон приложения Windows Console
- сохраняя
#include "stdafx.h"
но заменить созданный шаблонmain()
с указанным выше источником - щелкните правой кнопкой мыши решение в обозревателе решений, выберите Свойства, откройте C/C++ -> Язык и измените "Стандарт языка C++" на "Стандарт ISO C++17 (/std: C++17)"
"Версия Windows SDK" в "Свойствах конфигурации" -> "Общие" была установлена на 10.0.17134.0.
Сборка не удалась с ошибкой компиляции error C3861: 'initialize': identifier not found
, Дальнейшие поиски нашли эту статью, cppwinrt.exe в Windows SDK, которая содержала пример приложения, которое использовало init_apartment();
вместо initialize();
поэтому с этим изменением мое приложение-пример компилируется и запускается, выводя список статей в качестве вывода.
В этой статье Microsoft Docs " Начало работы с C++/WinRT", датированной 07/07/2018, приведен пример консоли, в котором используется init_apartment();
скорее, чем initialize()
, Этот пример также является каналом синдикации, но с другим URL.
Второе тестовое приложение использовало шаблон C++/WinRT "Windows Universal" -> "Blank App (C++/WinRT)", который генерировал пример приложения, которое компилировалось и запускалось. В диалоговом окне "Свойства" -> "Общие" "Версия целевой платформы" была установлена на 10.0.17134.0, а "Минимум целевой платформы" была установлена на 10.0.15063.0.
1 ответ
Проекции C++/WinRT - это просто заголовки C++. Сами по себе они не предъявляют особых требований времени выполнения, кроме используемых вами API-интерфейсов времени выполнения Windows.
Реальный вопрос заключается в том, какие API вы используете в своем приложении (либо через C++/WinRT, либо с помощью расширений языка C++/CX (иначе /ZW
)) и какое значение вы установили в качестве WindowsTargetPlatformMinVersion
значение при создании приложения UWP.
С WindowsTargetPlatformVersion
установив последнюю версию Windows 10 SDK (17134), вы можете установить минимальную требуемую версию ОС для вашего приложения UWP 17134, 16299, 15063, 14393, 10586 или 10240. Вам необходимо протестировать приложение на этой версии и сделать уверен, что вы охраняете любое использование более новых API.
С практической точки зрения вам не нужно поддерживать 10240, поэтому в Visual Studio для нового проекта по умолчанию используется значение 10586. Для потребительских выпусков 14393 - это столько же лет, сколько вы когда-либо можете встретить в реальном мире.