Ответ 1
С++/CLI (/CLR
) a.k.a. Управляемый С++ не поддерживается для универсальной платформы приложений Windows и не поддерживается для Windows 8 Store или Windows phone 8.
Что вы видите, это языковые расширения С++/CX (/ZW
), которые используются в MSDN и в большинстве образцов С++ для использования API WinRT. Путаница, с которой вы сталкиваетесь, распространена, потому что одни и те же ключевые слова языка из С++/CLI были повторно использованы при реализации С++/CX. Не существует .NET Runtime, никакой сборки мусора и никакого интерпретируемого кода, как в С++/CLI. См. Раздел блога Visual С++ Team С++/CX Part 0 of [n]: Введение для более подробной истории С++/CX.
Вам не нужно использовать С++/CX для создания или использования WinRT-API, но их гораздо проще кодировать с использованием расширений языка С++/CX, чем чистый С++. Вы можете использовать библиотеку шаблонов С++ Windows Runtime Library (WRL), а не С++/CX, но вам, в основном, придется выяснить, как ваш собственный, так как есть очень мало образцов, которые используют его, и MSDN предполагает, что вы собираетесь использовать С++/CX.
В стандартных образцах используется
Microsoft::WRL::ComPtr
smart-pointer при работе с COM-интерфейсами, отличными от WinRT, например Direct3D, но обычно это единственная часть WRL, используемая стандартными образцами. Я использую WRL в DirectX Tool Kit, чтобы использовать некоторые конкретные API WinRT, если вы хотите увидеть некоторые ограниченные примеры использования его вместо С++/CX.
Для разработки API WinRT с WRL также требуется много ручной синхронизации с файлами MSIL для генерации необходимых метаданных (но не кода). Если вы являетесь экспертом в ATL, у вас будет возможность использовать WRL для разработки WinRT API, но в противном случае он, вероятно, не будет стоить производительности, чтобы полностью избежать С++/CX.
Тем не менее, вы можете легко изолировать использование С++/CX для определенных модулей в своем приложении. Я делаю это в своем Direct3D UWP Visual Studio шаблоне, так что большая часть кода на самом деле является "чистым" С++.