Reflection WinRT反射(C+;+;/CX)

Reflection WinRT反射(C+;+;/CX),reflection,windows-runtime,introspection,c++-cx,Reflection,Windows Runtime,Introspection,C++ Cx,如何在C++/CX中内省对象?我知道如何获取它的类名(使用IInspectable),但我无法弄清楚如何获取它的属性列表,或者如果我只有方法的名称(字符串),如何调用方法。我在这里和Google上搜索了答案,但我找到的与WinRT的.NET层有关(System.Reflection命名空间在C++/CX中似乎不可用)。即使是大多数正常的.NET反射也不包括在WinRT应用程序可用的.NET子集中。我没有发现任何与反射相关的类型。这意味着(除非我忽略了什么),可用的API不会公开反射 虽然我不明白

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

即使是大多数正常的.NET反射也不包括在WinRT应用程序可用的.NET子集中。我没有发现任何与反射相关的类型。这意味着(除非我忽略了什么),可用的API不会公开反射

虽然我不明白为什么它不可用。元数据已经存在,这应该足够了


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

正如svick所暗示的,您将类名(从IInspectable::GetRuntimeClassName检索)交给RoGetMetaDataFile。这将返回一个。现在打电话。这将返回一个typedef令牌。现在调用,它将为您提供有关该类型的属性


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

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

James McNellis去年发布了Cx反射的完全C++库< /P>


系统名称空间下的任何内容都不能从C++/CX获得。所有这些都是特定于.Net的。可以肯定的是,获取IMetaDataImport2接口指针实际上是RoGetMetaDataFile()。作为本机函数不是问题,C++/CX生成本机代码。没有理由不允许在应用商店的应用中进行对象自省。苹果确实允许这样做。至于RoGetMetaDataFile,我可以将它用于外部组件的类(我在另一个项目中创建了一个DLL),但不能用于我称之为RoGetMetaDataFile的同一个项目中的类。我不认为这是故意的行为,显然我没有正确使用RoGetMetaDataFile,或者这是早期预览中的一个错误。@Atamiri,我不知道原因。但我认为在.Net的WinRT子集中几乎不存在.Net反射这一事实说明了一些事情。@svick,.Net反射在Metro风格的应用程序中可用。诀窍是来自System.Reflection命名空间的GetTypeInfo()扩展方法。它在类型对象上被调用,并返回一个包含缺少反射API的TypeInfo对象。在我将问题发布到这里之前,我曾尝试使用RoGetMetaDataFile,但它不起作用(找不到GetRuntimeClassName返回的类型)。GetRuntimeClassName返回的字符串是什么?返回了什么错误?您要传递给RoGetMetaDataFile的参数是什么?可以不调用
FindTypeDefByName
,而直接使用
RoGetMetaDataFile
通过其最后一个输出参数返回的
mdTypeDef