有没有办法在c ++ / cx ref类上实现.net之类的属性?

时间:2014-09-15 01:47:51

标签: c++ windows-runtime c++-cx

想知道是否有办法以类似.net属性的方式在c ++ / cx ref类上实现属性。我试图从Platform::Metadata::Attribute类继承,这是一个其他WinRT属性继承自的抽象类。但是当我尝试使用该属性时,我得到的只是编译器错误。

2 个答案:

答案 0 :(得分:3)

您可以使用现有属性,但无法创建任何新属性类型。这是WinRT的限制。来自MSDN的引用:

  

<强>属性

     

属性是一个元数据值,可以应用于任何Windows运行时类型或类型成员,并且可以在运行时进行检查。 Windows运行时在Windows :: Foundation :: Metadata命名空间中定义了一组公共属性。 此版本中的Windows运行时不支持公共接口上的用户定义属性。

答案 1 :(得分:2)

WinRT和C ++ / CX都不支持属性。 Platform :: Metadata :: Attribute命名空间完全存在的唯一原因是它们可以出现在.winmd文件中。哪些是元数据文件,编译器可以使用它来读取用另一种语言编写的WinRT定义的声明。这对于像Visual Studio这样的编译器或对象浏览器是有用的。 .winm文件是从.idl文件创建的,与在COM和类型库中完成的方式非常相似。或者由编译器生成。

只有两个这样的属性。 DefaultAttribute对应[default] IDL属性,FlagsAttribute对应[flags]。它们尚未在MSDN上记录,WinRT文档通常非常缺乏。 [默认]以前存在,但有了新的含义。 [flags]是新的,意味着它与.NET中的相同。您可以在计算机的C:\ Program Files(x86)\ Windows Kits \ 8.1 \ Include \ winrt目录中的* .idl文件中看到许多这两个属性的示例。

从这些IDL文件中可以看到的其他内容是WinRT实际上并不支持方法重载,泛型,实现继承或异常。它们是语言投影添加的功能。 WinRT的核心仍​​然是像旧的COM一样很多。工具中有很多聪明的代码可以隐藏它。像C ++ / CX一样。也是Javascript可以直接调用C ++的核心原因,即使它们的运行时实现完全不同。所需的胶水很薄。