我如何用纯c++开发通用的windows 10应用程序,而不是c++ /CLI
How can I develop universal windows 10 apps with pure C++ and not C++/CLI?
我想使用c++/DirectX/XAML开发通用的windows应用程序。但是似乎没有办法逃避微软的c++/CLI语言。我已经浏览了默认情况下创建pty项目时的代码,它都是c++/CLI。
c++/CLI (/CLR
)又名Managed c++ 是不支持对于通用的Windows apps平台,也不支持Windows 8 Store或Windows phone 8。
你看到的是c++/CX (/ZW
)语言扩展,在MSDN和大多数c++示例中使用WinRT api。您所遇到的困惑是常见的,因为在实现c++/CX时重用了来自c++/CLI的相同语言关键字。没有。net运行时,没有垃圾收集,也没有像c++/CLI那样的解释代码。有关c++/CX历史的更多信息,请参阅Visual c++团队博客系列c++/CX第0部分:介绍。
您不需要使用c++/CX编写或使用WinRT api,但是使用c++/CX语言扩展比使用纯c++更容易编写代码。你可以使用c++模板库Windows运行时库(WRL)而不是c++/CX,但你将不得不自己弄清楚如何使用它,因为使用它的示例很少,MSDN假定你将使用c++/CX。
标准样本在处理非winrt COM api(如Direct3D)时使用
Microsoft::WRL::ComPtr
智能指针,但通常这是标准样本使用的WRL的唯一部分。我利用WRL在DirectX工具包消费一些特定的WinRT api,如果你想看到一些有限的例子,使用它而不是c++/CX。
用WRL编写WinRT api还需要大量与MSIL文件手动同步的工作,以生成所需的元数据(但不是代码)。如果您是ATL方面的专家,那么您可以使用WRL来编写WinRT api,但除此之外,为了完全避免c++/CX而牺牲生产力可能是不值得的。
也就是说,您可以轻松地将c++/CX的使用隔离到应用程序中的特定模块。我在我的Direct3D UWP Visual Studio模板中这样做,这样大部分代码实际上是"纯"的c++。
看看Windows运行时的现代c++
项目描述页:
Modern c++ Library提供了一个标准c++语言投影Windows运行时。不需要使用非标准语言扩展或神秘的ABI接口和函数。有了Modern,你就有了力量库,无论您是否想要使用基于类的API或深入底层以获得更多控制的能力。
这看起来是一个非常完整的实现。
更新 (2016-10-07): Modern的作者已加入Microsoft,继续从事标准c++语言投影的工作。它已被重新命名为 c++/WinRT,并于最近在CppCon 2016上发表(参见在YouTube上拥抱Windows运行时的标准c++)。
库的预发布版本(只有头文件,没有编译器)应该很快就可以使用。在CppCon的谈话中,已经宣布"我们[Microsoft]希望能很快为您[我们]提供一些可用的东西"
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?