本周早些时候,Kenny Kerr presented C++/WinRT at CppCon 20161。这是Windows运行时的标准C++投影,基于Modern

据我了解,C++/CX编译器/预处理器/代码生成器不涉及标准C++代码,而C++/WinRT是标准C++库,我天真的解释是,可以同时使用C++/CX和C++/WinRT在同一个项目中。

问题:

  • 首先,我的天真的解释正确吗?
  • 如果可以,可以在同一编译单元中使用C++/CX和C++/WinRT吗?
  • 如果不能将C++/CX和C++/WinRT驻留在同一编译单元中,可以将其混合到什么粒度?
  • C++/WinRT可以使用在同一项目中使用C++/CX实现的类型吗? (我希望这很困难,因为C++/WinRT编译器需要从.winmd元数据生成 header ,所以对(预)编译器输出有依赖性。)

  • 万一重要,这些问题的答案使我可以立即决定如何将C++/CX项目推向 future 。

    1 Embracing Standard C++ for the Windows Runtime (on YouTube)

    最佳答案

    关于“C++/WinRT是否可以使用在同一项目中使用C++/CX实现的类型”的问题?

    答案是是和否。在同一项目中定义了“引用类”,因为这样的项目必须在启用C++/CX的情况下进行编译,因此您的代码可以像使用任何引用类一样简单地使用该类。

    但是,如果您想将“ref类”用作C++/WinRT投影,则答案实际上是“否”。

    为了获得C++/WinRT投影的类定义,您需要在“引用类”的元数据上运行cppwinrt.exe编译器。那将需要以某种方式获取元数据。您可以建立某种机制来编译“ref class”一次,获取winmd,通过mdmerge对其进行处理,使其以规范的形式,在元数据上运行cppwinrt.exe以获取预计的类定义,然后包括生成的 header 。

    或者,您可以编写IDL来描述“ref类”,使用MIDLRT将其编译为元数据,然后运行cppwinrt.exe。实际的IMO都不是。

    最合理的选择是像在C++/CX类型中一样直接使用ref类,因为定义在同一解决方案中。下一个最实用的解决方案是将类放在一个单独的项目中,对其进行编译以获取winmd,然后从winmd创建 header 。这种方法还允许使用“ref类”(通过投影)的单独项目在不使用C++/CX代码的情况下进行构建。

    为了完全透明,请注意我们的初始发行版(现在可以在https://github.com/Microsoft/cppwinrt上获得)不包括cppwinrt.exe编译器本身。相反,它包含C++/WinRT头文件,其中包含Windows 10周年更新SDK中定义的所有Windows运行时类型/API的投影-这包括通用平台API和所有扩展SDK API。

    关于c++ - 可以在同一项目中使用C++/CX和C++/WinRT吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39686332/

    10-11 22:07
    查看更多