首页 > 解决方案 > C++/WinRT 中有哪些反射机制?

问题描述

我记得 C++ 在 Bjarne Stroustrup 的原始The C++ Programming Language之后的某个时间添加了一些运行时类型信息 (RTTI) ,但我从来没有打电话使用它。

我熟悉一些 COM 和 CLR 反射 API,包括 ITypeInfo 和 System.Reflection。这些是否适用于编译的 C++/WinRT 应用程序中声明的类型?

这个问题解决了 5 年前 C++/CX 的一个类似问题,有变化吗?

标签: reflectionc++-winrt

解决方案


C++ /WinRT 不会添加到 C++ 的本机反射功能。但是,xlang 元数据读取器 API 可用于检查描述 WinRT 类型的 Windows 运行时元数据文件 (.winmd)。您可以在此处查看元数据阅读器库(并且在此 repo 中的各种工具中有使用示例):

https://github.com/Microsoft/xlang/blob/master/src/library/meta_reader.h

您可以将它与 Windows 函数 RoGetMetadataFile 结合使用,以在运行时定位类型的元数据。

https://docs.microsoft.com/en-us/windows/desktop/api/rometadataresolution/nf-rometadataresolution-rogetmetadatafile

请注意,C++ /WinRT 本身在运行时不使用 winmd 文件,因此,使用 C++ /WinRT 构建的代码不需要 winmd 在运行时可用。如果 winmd 不存在,您将无法依赖它来获取类型信息。

如果为用 C++ /WinRT 编写的类型提供元数据文件,则 .NET 运行时可以使用 winmd 反映投影类型,其方式与它可以反映使用 .NET 运行时编写的类型大致相同。

C++ /WinRT 目前不提供对类型的动态调用的任何支持。这是一个不常见但反复出现的问题,并且在我们的积压工作中。

谢谢,


推荐阅读