WinRT中有一些名为投影类型的内容。例如,在元数据中,IXamlType.UnderlyingType
定义为:
TypeName UnderlyingType { get; }
但是,当在C#应用程序中使用时,它会更改如下:
Type UnderlyingType { get; }
我的问题是 - 是否有关于规则,API,用于此类映射的属性的文档?
答案 0 :(得分:2)
这是正确的,CLR中内置的语言投影会自动将WinRT类型映射到CLR类型。文档很难得到,尤其是当它仍然是beta材料时。但是有一篇很好的白皮书可以描述CLR投影的某些方面。下载是(当前)available here(注意:Word .docx文件)
答案 1 :(得分:2)
当使用低级创作工具(带有/ winrt开关和MDMERGE的MIDL)创建Windows元数据时,程序集中通常使用typedef的任何位置,typedef将替换为指向同一程序集内的typerefs。
这允许CLR重写winmd文件的内容,用相应的CLR类型替换windows运行时类型。最简单的例子是Windows.Foundation.Uri类型被System.Uri替换为C#应用程序。 CLR内部知道如何在W.F.Uri和S.Uri之间进行映射,它会自动为您完成此翻译。
所有这些都是由系统自动处理的,有规则,但我不相信这个过程是开发人员可控的 - 我相信类型映射会被刻录到CLR实现中。
答案 2 :(得分:1)
这是我正在谈论的链接,这是第9频道的视频http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-874T请注意,这是基于开发者预览版的Build会议视频。我无法预测消费者预览中有多少信息发生了变化。
我同意应该有关于这是如何工作的文档。希望他们能尽快更新MSDN上的文档。
答案 3 :(得分:1)
他们说源代码是最好的文档。在这种情况下,它似乎是唯一的文档。以下是我通过.NET源码进行探索的结果。
元数据投影列表以.NET source using a macro iterator编码。
此标头包含在将其转换为手头任务的数据结构的各个位置。我找到的最容易到达的地方是WinMD metadata importer及其adapter。 来自消息来源:
// 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
,使用IID_IMetaDataImport
与.winmd
调用OpenScope()来获取元数据导入程序。然后,当您仔细阅读元数据时,它会为您执行IMap
到IDictionary
之类的转换。我推测,但我很确定Visual Studio在从元数据或接口实现生成类型定义时所做的事情。
您还可以将带有宏迭代器的标头包含到您自己的C / C ++项目中,并将其中的数据转换为对您最有用的任何形式,例如:从中生成代码。