WinRT Documentación de tipos proyectados

Hay algo llamado tipos proyectados en WinRT. Por ejemplo, en metadatos, el IXamlType.UnderlyingType se define como:

 TypeName UnderlyingType { get; } 

Sin embargo, cuando se utiliza en una aplicación C #, cambia de la siguiente manera:

 Type UnderlyingType { get; } 

Mi pregunta es: ¿existe alguna documentación con respecto a las reglas, API, atributos utilizados para dichas asignaciones?

Eso es correcto, la proyección de lenguaje incorporada en el CLR asigna los tipos de WinRT a los tipos de CLR automáticamente. La documentación es difícil de conseguir, especialmente ahora que todavía es material beta. Pero hay un excelente documento disponible que describe algunos aspectos de la proyección CLR. La descarga está (actualmente) disponible aquí (Nota: archivo .docx de Word)

Cuando se crean metadatos de Windows utilizando las herramientas de creación de bajo nivel (MIDL con el modificador / winrt y MDMERGE), cualquier lugar en el ensamblaje que normalmente usaría typedef, el typedef se reemplaza por typerefs que apuntan dentro del mismo ensamblaje.

Eso permite que el CLR reescriba el contenido del archivo winmd reemplazando el tipo de tiempo de ejecución de Windows con un tipo de CLR correspondiente. El ejemplo más simple de esto es el tipo Windows.Foundation.Uri se reemplaza con System.Uri para aplicaciones C #. El CLR sabe internamente cómo mapear entre WFUri y S.Uri y automáticamente hace esta traducción por usted.

Todo esto se maneja automáticamente por el sistema, existen reglas para ello, pero no creo que el proceso sea controlable por el desarrollador; creo que las asignaciones de tipo están grabadas en la implementación de CLR.

Este es el enlace del que estaba hablando, que es un video en el Canal 9 http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-874T. Tenga en cuenta que este es un video de la conferencia Build que se basa en el Vista previa para desarrolladores. No puedo predecir cuánto de esta información ha cambiado con la Vista previa del consumidor.

Estoy de acuerdo en que debería haber documentación sobre cómo funciona esto. Esperemos que se actualice la documentación en MSDN pronto.

Dicen que el código fuente es la mejor documentación. En este caso parece ser la única documentación. Aquí están mis conclusiones de espeleología a través de la fuente .NET.

La lista de proyecciones de metadatos se codifica en la fuente .NET mediante un iterador de macro .

Este encabezado se incluye en varios lugares donde se transforma en estructuras de datos para la tarea en cuestión. El lugar más accesible para nosotros que he encontrado está en el importador de metadatos de WinMD y su adaptador . De la fuente:

 // 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. 

Mi opinión es que puede usar CoCreateInstance(CLSID_CorMetaDataDispenser...) para crear un IMetaDataDispenser , llame a OpenScope () con IID_IMetaDataImport con un archivo .winmd para obtener el importador de metadatos. Luego hará conversiones como IMap a IDictionary para usted a medida que lee los metadatos. Especulo, pero estoy bastante seguro de que eso es lo que hace Visual Studio cuando genera definiciones de tipo a partir de metadatos o implementaciones de interfaz.

También puede incluir el encabezado con el iterador de macro en su propio proyecto de C / C ++ y transformar los datos en él en la forma que sea más útil para usted, por ejemplo, generar código a partir de él.