2012-05-21 24 views
5

Hay algo llamado tipos proyectados en WinRT. Por ejemplo, en los metadatos, el IXamlType.UnderlyingType se define como:WinRT Documentación de tipos proyectados

TypeName UnderlyingType { get; } 

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

Type UnderlyingType { get; } 

Mi pregunta es - ¿hay alguna documentación relativa a las normas , API, atributos utilizados para tales asignaciones?

+0

No se pudo encontrar ninguna documentación al respecto. Solo he visto algunos videos al respecto en el Canal 9, pero probablemente no sea una inmersión lo suficientemente profunda para ti. ¿Puede enviarle los enlaces si lo desea? – ChristiaanV

+0

@ChristiaanV - los enlaces serían muy útiles, gracias. Sin embargo, una documentación completa y formal en este sentido mi Microsoft sería extremadamente útil y es un deber en mi humilde opinión. – logicnp

Respuesta

2

Correcto, la proyección del lenguaje integrada en el CLR asigna automáticamente los tipos de WinRT a los tipos de CLR. La documentación es difícil de conseguir, especialmente ahora que se trata de material beta. Pero hay un libro blanco excelente disponible que describe algunos aspectos de la proyección de CLR. La descarga es (actualmente) available here (Nota: archivo .docx de Word)

1

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 de compilación que se basa en la vista previa del desarrollador. No puedo predecir qué cantidad de esta información ha cambiado con Consumer Preview.

Acepto que debe haber documentación sobre cómo funciona esto. Esperemos que actualicen la documentación en MSDN pronto.

2

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

Que permite al CLR reescribir los contenidos 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 las aplicaciones System.Uri to C#. El CLR sabe internamente cómo mapear entre W.F.Uri y S.Uri y automáticamente hace esta traducción por usted.

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

+0

Gracias por la información. Está bien, pero si el proceso no es controlable por dev, ¡pero la documentación del proceso en sí sería genial! – logicnp

0

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

La lista de proyecciones de metadatos está codificada en .NET source using a macro iterator.

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 WinMD metadata importer y es adapter. 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 se puede utilizar para crear un CoCreateInstance(CLSID_CorMetaDataDispenser...)IMetaDataDispenser, llame OpenScope() con IID_IMetaDataImport con un archivo .winmd para obtener el importador de metadatos. Luego, realizará conversiones como IMap a IDictionary mientras examina los metadatos. Yo especulo, pero estoy bastante seguro de que es lo que hace Visual Studio cuando genera definiciones de tipo de metadatos o implementaciones de interfaces.

También puede incluir el encabezado con el iterador de macros en su propio proyecto C/C++ y transformar los datos allí dentro en la forma que le sea más útil, p. Ej. generar código a partir de él.

Cuestiones relacionadas