I want to develop universal windows apps using C++/DirectX/XAML. But it seems like there's no way to escape Microsoft's C++/CLI language. I've already browsed through the code that isnthere by default when you make an pty project, and it is all C++/CLI.
C++/CLI (/CLR
) a.k.a. Managed C++ is not supported for the universal Windows apps platform, and is not supported for Windows 8 Store or Windows phone 8 either.
What you are seeing are C++/CX (/ZW
) language extensions that are used on MSDN and in most of the C++ samples to consume WinRT APIs. The confusion you are having is common because the same language keywords from C++/CLI were reused when implementing C++/CX. There is no .NET Runtime, no garbage collection, and no interpreted code as there is in C++/CLI. See the Visual C++ Team blog series C++/CX Part 0 of [n]: An Introduction for more on the history of C++/CX.
You do not have to use C++/CX to author or consume WinRT APIs, but they are much easier to code against using C++/CX language extensions than pure C++. You can make use of the C++ template library Windows Runtime Library (WRL) rather than C++/CX, but you will mostly have to figure out how on your own as there are very few samples that use it and MSDN presumes you are going to use C++/CX.
The standard samples make use of
Microsoft::WRL::ComPtr
smart-pointer when dealing with non-WinRT COM APIs like Direct3D, but generally that's the only part of WRL used by the standard samples. I make use of WRL in DirectX Tool Kit to consume some specific WinRT APIs if you want to see some limited examples of using it instead of C++/CX.
Authoring WinRT APIs with WRL also requires a lot of manual sync work with MSIL files to generate the required metadata (but not code). If you are an expert in ATL, you would be equipped to use WRL for authoring WinRT APIs, but otherwise it's likely not worth the productivity hit to avoid C++/CX entirely.
That said, you can easily isolate C++/CX usage to specific modules in your application. I do this in my Direct3D UWP Visual Studio template so that the majority of the code is in fact 'pure' C++.