4

如何在 C++/CX 中内省对象?我知道如何获取它的类名(使用 IInspectable),但是如果我只有方法的名称(字符串),我无法弄清楚如何获取它的属性列表或如何调用方法。我在这里和谷歌搜索了答案,但我发现与 WinRT 的 .NET 层有关(C++/CX 中似乎没有 System.Reflection 命名空间)。

4

3 回答 3

6

正如 svick 所暗示的,您将类名(从 IInspectable::GetRuntimeClassName 检索)交给 RoGetMetaDataFile。这将返回一个IMetaDataImport2。现在调用IMetaDataImport2::FindTypeDefByName。这将返回一个 typedef 标记。现在调用IMetaDataImport2::GetTypeDefProps它将为您提供有关类型的属性。

从 typedef 属性中,您可以检索其他信息 - 如果它是接口/结构(或枚举),则枚举方法/字段,查找运行时类的类型(如果它是接口或类)等。

于 2011-09-26T14:16:03.673 回答
1

C++ 不提供任何特定的 API 来反映 WinRT 类型,这些类型在 CX 兼容的元数据文件中完全定义,您可以使用 CLR 本机元数据 API 来读取它们的定义。有一个片段

http://social.msdn.microsoft.com/Forums/windowsapps/en-US/211ef583-db11-4e55-926b-6d9ab53dbdb4/ccx-reflection

James McNellis 去年发布了用于 CX 反射的完整 C++ 库

http://seaplusplus.com/2012/04/26/cxxreflect-native-reflection-for-the-windows-runtime/

于 2013-08-23T19:57:12.580 回答
1

甚至大多数正常的 .Net 反射也不包含在 WinRT 应用程序可用的 .Net 子集中。而且我在WinRT 文档中没有找到任何与反射相关的类型。这意味着(除非我忽略了什么)反射根本不会被可用的 API 公开。

虽然我不明白为什么它不应该可用。元数据在那里,应该足够了。

在查看特定于 C++ 的函数时,有 function RoGetMetaDataFile()。似乎应该可以使用它来获取元数据。但它是本机 C++ 函数,而不是 C++/CX。这意味着它不容易使用(手动内存管理,……),我怀疑它会在商店中的应用程序中被允许。

于 2011-09-26T11:16:50.317 回答