Mar*_*wis 2 reflection idl windows-runtime
在Visual Studio 2012附带的MS IDL版本中,对WinRT的支持添加了以下构造:
[activatable(Windows.Networking.Sockets.IControlChannelTriggerFactory,
0x06020000)]
[threading(mta)]
[marshaling_behavior(agile)]
[version(0x06020000)]
runtimeclass ControlChannelTrigger
{
[default] interface Windows.Networking.Sockets.IControlChannelTrigger;
interface Windows.Foundation.IClosable;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用IMetaDataImport来分析winmd文件中的所有类型.如何找出"运行时类"实现的接口以及默认接口的接口?
如何找出"运行时类"实现的接口?
Windows元数据文件由关系数据库组成:它基本上是一组相互关联的表.您可以在ECMA 335的分区II中找到逻辑模式的规范.
每个运行时类和接口都由元数据数据库的TypeDef表中的一行表示."类型X实现接口I和J"关系由InterfaceImpl表中的行表示,它将类型定义映射到它们实现的接口.
事实证明,计算由类型实现的接口集非常困难,原因有很多.假设我们想要计算由XAML Button控件实现的接口集.需要执行以下所有步骤:
查找并加载定义的元数据文件Button.你可以通过电话来做到这一点RoGetMetaDataFile.
找到该Button类型的元数据标记.这实际上是该类型的唯一标识符.你可以通过电话来获得这个FindTypeDefByName.
我们需要计算该Button类型直接实现的所有接口.这可以通过调用来完成EnumInterfaceImpls.
该Button类型从派生ButtonBase型.这由TypeDef表的extends字段指定,您可以通过调用获得该字段GetTypeDefProps.我们需要计算它实现的所有接口.然后,我们需要做同样一路上涨的类层次结构-对Button,这是很多的类型: ContentControl,Control,FrameworkElement,UIElement,和DependencyObject.
请注意,其中一些类型可能在另一个元数据文件中定义.在这种情况下,InterfaceImpl将通过TypeRef令牌引用接口,而不是TypeDef令牌.TypeRef表包含对类型的引用.您需要解析该引用,加载正确的元数据文件,并在该元数据文件中查找目标类型.这可以使用我们已经执行的步骤来完成Button.
每个接口也可以实现其他接口,因此对于我们到目前为止在列表中累积的每个接口,我们需要获得该接口所需的接口集.这是通过递归获取每个接口的InterfaceImpls来完成的.
注意,就像基类的情况一样,也可以在另一个元数据文件中定义实现的接口.因此,您还需要使用与基类相同的过程来解决这些问题.
对于增加的挑战,Windows运行时支持通用接口.如果接口实现实例化的通用接口,则该实例化的接口将由TypeSpec表中的行表示,并且将在blob流中伴随签名.您需要解析签名.执行此操作的过程相当复杂,但数据格式在ECMA 335中完全指定.
此时,您将拥有该类型实现的完整接口集.通过检查与Button类型直接关联的InterfaceImpls可以找到默认接口:默认接口将DefaultAttribute应用于它(请注意,自定义属性应用于InterfaceImpl,而不是接口类型).您可以使用枚举每个InterfaceImpl的自定义属性EnumCustomAttributes.
所以,这是一项非常多的工作,而且需要大量的代码.我发现IMetaDataImport界面和它的朋友处理起来相当不友好,所以我为Boost许可的CxxReflect库编写了自己的.CxxReflect元数据库提供更好的类型检查,IMetaDataImport并包括解析签名所需的逻辑.它不是那么快IMetaDataImport,但它已经接近了.
CxxReflect Reflection库包含用于跨元数据文件边界解析类型以及与Windows运行时集成的大多数逻辑.它仍然处于alpha质量阶段,但它对于常见任务非常有效(它目前正在进行一些重构,以使类型解析逻辑可以重复用于反射以外的用途).
您当然可以自己实现逻辑,但这非常繁琐.在CxxReflect的开发过程中,我发现了几次我没有考虑到的另一个角落案例,并且不得不进行大量的返工.规范已经完成,但事情并不总是很明显.
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |