2012-05-21 13 views
5

C'è qualcosa chiamato tipi proiettati in WinRT. Ad esempio, nei metadati, la IXamlType.UnderlyingType è definito come:WinRT Documentazione dei tipi proiettati

TypeName UnderlyingType { get; } 

Tuttavia quando utilizzato in un app C#, cambia come segue:

Type UnderlyingType { get; } 

La mia domanda è - c'è qualche documentazione relativa alle regole , API, attributi utilizzati per tali mappature?

+0

Impossibile trovare alcuna documentazione a riguardo. Ho visto solo alcuni video su Canale 9, ma probabilmente non è abbastanza per te? Puoi inviarti i link se ti va? – ChristiaanV

+0

@ChristiaanV - i collegamenti sarebbero molto utili, grazie. Tuttavia, una documentazione completa e formale a questo proposito la mia Microsoft sarebbe estremamente utile ed è un obbligo IMHO. – logicnp

risposta

2

Corretto, la proiezione della lingua incorporata nel CLR esegue il mapping automatico dei tipi WinRT ai tipi CLR. La documentazione è difficile da trovare, specialmente adesso quando questo è ancora un materiale beta. Ma c'è un eccellente white paper disponibile che descrive alcuni aspetti della proiezione CLR. Il download è (al momento) available here (Nota: file .docx di Word)

1

Questo è il collegamento di cui stavo parlando che è un video su Canale 9 http://channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-874T Si noti che questo è un video della conferenza di creazione che si basa sull'anteprima dello sviluppatore. Non riesco a prevedere quanto di queste informazioni sia cambiato con l'anteprima del consumatore.

Sono d'accordo che ci dovrebbe essere documentazione su come funziona. Si spera che aggiorneranno presto la documentazione su MSDN.

2

Quando i metadati di Windows vengono creati utilizzando gli strumenti di basso livello di authoring (MIDL con l'opzione/winrt e MDMERGE), qualsiasi posizione nell'assembly che normalmente utilizzerà un typedef, il typedef viene sostituito con typerefs che puntano all'interno dello stesso assembly.

che permette al CLR riscrivere il contenuto del file winmd sostituendo il tipo finestre runtime con un corrispondente tipo CLR. L'esempio più semplice di questo è il tipo Windows.Foundation.Uri viene sostituito con le applicazioni System.Uri in C#. Il CLR conosce internamente come mappare tra W.F.Uri e S.Uri e automaticamente esegue questa traduzione per te.

Tutto questo è gestito automaticamente dal sistema, ci sono delle regole per questo, ma non credo che il processo sia controllabile dallo sviluppatore - Credo che i mapping dei tipi vengano masterizzati nell'implementazione CLR.

+0

Grazie per le informazioni. Va bene, ma se il processo non è controllabile, la documentazione del processo stesso sarebbe eccezionale! – logicnp

0

Dicono che il codice sorgente è la migliore documentazione. In questo caso sembra essere l'unica documentazione. Ecco i miei risultati dalla spelunking attraverso l'origine .NET.

L'elenco delle proiezioni metadati è codificato nel .NET source using a macro iterator.

Questa intestazione è inclusa in vari punti in cui viene trasformata in strutture di dati per l'attività in corso. Il posto più accessibile che ho trovato è lo WinMD metadata importer e il suo adapter. Dalla fonte:

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

La mia opinione è che si può utilizzare per creare un CoCreateInstance(CLSID_CorMetaDataDispenser...)IMetaDataDispenser, chiamare OpenScope() con IID_IMetaDataImport con un file .winmd per ottenere l'importatore di metadati. Effettuerà quindi conversioni come IMap a IDictionary mentre esaminate i metadati. Immagino, ma sono abbastanza sicuro che è ciò che fa Visual Studio quando genera definizioni di tipi da metadati o implementazioni di interfaccia.

È inoltre possibile includere l'intestazione con l'iteratore di macro nel proprio progetto C/C++ e trasformare i dati in esso in qualsiasi forma sia più utile per l'utente, ad es. generare codice da esso.