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

Is there a way to implement .net like attributes on a c++/cx ref class?

本文关键字:实现 net 属性 ref c++ cx 有没有      更新时间:2023-10-16

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

您可以使用现有属性,但不能创建任何新的属性类型。这是 WinRT 的限制。MSDN的一句话:

属性

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

WinRT 和 C++/CX 都不支持属性。 Platform::Metadata::Attribute 命名空间存在的唯一原因是因为它们可以出现在 .winmd 文件中。 哪些是编译器可用于读取以另一种语言编写的 WinRT 定义的声明的元数据文件。 这仅适用于这样的编译器或对象浏览器,例如Visual Studio中的编译器或对象浏览器。 .winmd 文件是从 .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++的核心原因,即使它们的运行时实现截然不同。 所需的胶水非常稀。