问题 如何使用纯C ++而不是C ++ / CLI开发通用Windows 10应用程序?


我想使用C ++ / DirectX / XAML开发通用Windows应用程序。但似乎没有办法逃避微软的C ++ / CLI语言。当你创建一个pty项目时,我已经浏览了默认的代码,而且它都是C ++ / CLI。


6998
2017-09-06 14:33


起源

嗯,不,你几乎不用担心C ++ / CLI。它不适用于通用应用程序。如果你想在纯C ++中实现它,那么你将不得不使用WRL库来获取它。你最好了解COM以获得成功的希望。不是一般技能。否则,C ++ / CX语言扩展是很容易的,所有示例代码(使用示例)都使用它,并且非常有效地隐藏COM粘合剂。 - Hans Passant
如果您使用的是下载的visual studio 2015,则默认情况下不会安装c ++。您必须选择自定义安装并选择C ++。 - ScottMcP-MVP


答案:


C ++ / CLI(/CLR)a.k.a. 托管C ++ 是 不支持 对于通用Windows应用程序平台,Windows 8商店或Windows Phone 8也不支持。

你看到的是C ++ / CX(/ZW)在MSDN和大多数C ++示例中使用的语言扩展,以使用WinRT API。您遇到的困惑很常见,因为在实现C ++ / CX时,C ++ / CLI中使用了相同的语言关键字。没有.NET运行时,没有垃圾收集,也没有C ++ / CLI中的解释代码。请参阅Visual C ++团队博客系列 [n]的C ++ / CX第0部分:简介 有关C ++ / CX历史的更多信息。

没有 使用C ++ / CX来创作或使用WinRT API,但使用C ++ / CX语言扩展比使用纯C ++更容易编码。您可以使用C ++模板库 Windows运行时库(WRL) 而不是C ++ / CX,但你必须自己弄清楚如何使用它,而MSDN假设你将使用C ++ / CX。

标准样品使用 Microsoft::WRL::ComPtr 处理非WinRT COM API(如Direct3D)时的智能指针,但通常这是标准样本使用的WRL的唯一部分。我在中使用WRL DirectX工具包 如果要查看使用它而不是C ++ / CX的一些有限示例,请使用某些特定的WinRT API。

使用WRL创作WinRT API还需要与MSIL文件进行大量手动同步才能生成所需的元数据(但不能生成代码)。如果您是ATL的专家,您将有能力使用WRL来创建WinRT API,但是否则完全避免使用C ++ / CX可能不值得提高生产力。

也就是说,您可以轻松地将C ++ / CX使用情况隔离到应用程序中的特定模块。我这样做了 Direct3D UWP Visual Studio模板 所以大多数代码实际上都是“纯粹的”C ++。


10
2017-09-06 20:02



作为WRL,C ++ / WinRT的替代品(参见 C ++ - 的WinRT)正在路上。它是Windows运行时的标准C ++语言投影。它可以以对C ++开发人员来说自然的方式使用WinRT类型。我不知道在发布类型时它提供了多少,即在生成.winmd元数据时涉及多少手工工作。 - IInspectable


看一下 用于Windows运行时的现代C ++

从项目描述页面:

Modern C ++ Library提供标准C ++语言投影   Windows运行时。无需使用非标准语言扩展   或者神秘的ABI接口和功能。随着现代,你获得了力量   用于Windows运行时的库,无论您是否想要方便   基于类的API或能够进行更多控制的能力。

它看起来像一个非常完整的实现。


更新 (2016-10-07):作者 现代 已加入Microsoft继续开发标准C ++语言投影。它被重新命名为 C ++ / WinRT的,最近在CppCon 2016上展出(见 为Windows运行时使用标准C ++(在YouTube上))。

该库的预发布版本(只是没有编译器的头文件)应该很快就可以使用。在CppCon谈话中已经宣布 “我们[微软]希望尽快给你[我们]提供一些东西”


6
2017-09-06 22:21



即使只有链接答案,这也是一个很好的答案。 - CodeAngry