WinRT 中有一种叫做投影类型的东西。例如,在元数据中,IXamlType.UnderlyingType
定义为:
TypeName UnderlyingType { get; }
但是,当在 C# 应用程序中使用时,它会发生如下变化:
Type UnderlyingType { get; }
我的问题是 - 是否有任何关于用于此类映射的规则、API、属性的文档?
WinRT 中有一种叫做投影类型的东西。例如,在元数据中,IXamlType.UnderlyingType
定义为:
TypeName UnderlyingType { get; }
但是,当在 C# 应用程序中使用时,它会发生如下变化:
Type UnderlyingType { get; }
我的问题是 - 是否有任何关于用于此类映射的规则、API、属性的文档?
没错,CLR 中内置的语言投影会自动将 WinRT 类型映射到 CLR 类型。文档很难获得,尤其是现在这仍然是测试版材料。但是有一个很好的白皮书描述了 CLR 投影的某些方面。下载(当前)可在此处获得(注:Word .docx 文件)
当使用低级创作工具(带有 /winrt 开关和 MDMERGE 的 MIDL)创建 Windows 元数据时,程序集中通常使用 typedef 的任何位置,typedef 都将替换为指向同一程序集内的 typerefs。
这允许 CLR 重写 winmd 文件的内容,将 windows 运行时类型替换为相应的 CLR 类型。最简单的例子是 Windows.Foundation.Uri 类型被 System.Uri 替换为 C# 应用程序。CLR 在内部知道如何在 WFUri 和 S.Uri 之间进行映射,它会自动为您执行此转换。
所有这些都是由系统自动处理的,有规则,但我不相信这个过程是开发人员可以控制的——我相信类型映射被烧录到 CLR 实现中。
这是我正在谈论的链接,它是第 9 频道上的视频http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-874T请注意,这是基于构建会议的视频开发者预览。我无法预测消费者预览版中这些信息有多少变化。
我同意应该有关于这是如何工作的文档。希望他们能尽快更新 MSDN 上的文档。
他们说源代码是最好的文档。在这种情况下,它似乎是唯一的文档。以下是我通过 .NET 源代码探索的发现。
元数据投影列表使用宏迭代器在 .NET 源中编码。
此标头包含在各个位置,在这些位置它被转换为手头任务的数据结构。我发现对我们来说最容易访问的地方是WinMD 元数据导入器及其适配器。从来源:
// This metadata importer is exposed publically via CoCreateInstance(CLSID_CorMetaDataDispenser...).
// when the target is a .winmd file. It applies a small number of on-the-fly
// conversions to make the .winmd file look like a regular .NET assembly.
我的看法是,您可以使用文件CoCreateInstance(CLSID_CorMetaDataDispenser...)
来创建一个IMetaDataDispenser
调用OpenScope()以获取元数据导入器。然后,它会在您阅读元数据时为您进行类似的转换。我推测,但我很确定这就是 Visual Studio 在从元数据或接口实现生成类型定义时所做的事情。IID_IMetaDataImport
.winmd
IMap
IDictionary
您还可以将带有宏迭代器的标头包含到您自己的 C/C++ 项目中,并将其中的数据转换为对您最有用的任何形式,例如从中生成代码。