Al livello più basso, WinRT è un modello a oggetti definito a livello ABI. Usa COM come base (quindi ogni oggetto WinRT implementa IUnknown
e ricontatta) e costruisce da lì. Aggiunge molti nuovi concetti rispetto a COM di vecchi, la maggior parte dei quali provengono direttamente da .NET - ad esempio, il modello a oggetti WinRT ha delegati e gli eventi sono fatti in stile .NET (con delegati e aggiungi / rimuovi abbonato metodi, uno per evento) anziché il vecchio modello COM di origini e sink di eventi. Tra le altre cose degne di nota, WinRT ha anche interfacce parametrizzate ("generiche").
Un altro grande cambiamento è che tutti i componenti WinRT hanno metadati disponibili per loro, proprio come gli assembly .NET. In COM è una specie di quello con typelibs, ma non tutti i componenti COM li avevano. Per WinRT, i metadati sono contenuti nei file .winmd - guarda dentro "C: \ Programmi (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" in Anteprima sviluppatore. Se cerchi, vedrai che in realtà sono assiemi CLI senza codice, solo tabelle di metadati. Puoi aprirli con ILDASM, in effetti. Nota, questo non significa che WinRT stesso sia gestito, ma semplicemente riutilizza il formato del file.
Quindi ci sono un certo numero di librerie implementate in termini di quel modello di oggetti - che definiscono le interfacce e le classi WinRT. Ancora una volta, guarda la cartella "Windows Metadata" di cui sopra per vedere cosa c'è lì; o semplicemente avvia Object Browser in VS e seleziona "Windows 8.0" nel selettore di framework, per vedere cosa è coperto. C'è molto lì e non si occupa solo dell'interfaccia utente: ottieni anche spazi dei nomi come Windows.Data.Json
, o Windows.Graphics.Printing
, o Windows.Networking.Sockets
.
Quindi ottieni diverse librerie, che si occupano in particolare dell'interfaccia utente - per lo più si tratta di vari spazi dei nomi sotto Windows.UI
o Windows.UI.Xaml
. Molti di loro sono molto simili agli spazi dei nomi WPF / Silverlight - ad esempio, Windows.UI.Xaml.Controls
sono strettamente corrispondenti System.Windows.Controls
; idem per Windows.UI.Xaml.Documents
ecc.
Ora .NET ha la possibilità di fare riferimento direttamente ai componenti WinRT come se fossero assembly .NET. Funziona diversamente dall'interoperabilità COM: non sono necessari artefatti intermedi come gli assembly di interoperabilità, è solo /r
un file .winmd e tutti i tipi e i relativi membri nei suoi metadati diventano visibili a te come se fossero oggetti .NET. Si noti che le stesse librerie WinRT sono completamente native (e quindi i programmi C ++ nativi che utilizzano WinRT non richiedono affatto CLR) - la magia per esporre tutta quella roba come gestita è all'interno del CLR stesso, ed è di livello abbastanza basso. Se ildasm un programma .NET che fa riferimento a un .winmd, vedrai che in realtà sembra un riferimento ad un assieme esterno - non ci sono giochi di prestigio come il tipo di inserimento lì.
Non è nemmeno una mappatura smussata: CLR tenta di adattare i tipi di WinRT ai loro equivalenti, ove possibile. Ad esempio, GUID, date e URI diventano System.Guid
, System.DateTime
e System.Uri
, rispettivamente; Interfacce di raccolta WinRT come IIterable<T>
e IVector<T>
diventano IEnumerable<T>
e IList<T>
; e così via. Questo funziona in entrambi i modi: se si dispone di un oggetto .NET che lo implementa IEnumerable<T>
e lo restituisce a WinRT, lo vedrà come IIterable<T>
.
In definitiva, ciò significa che le tue app .NET Metro hanno accesso a un sottoinsieme delle librerie .NET standard esistenti e anche alle librerie (native) WinRT, alcune delle quali - in particolare Windows.UI
- sembrano molto simili a Silverlight, per quanto riguarda le API. Hai ancora XAML per definire la tua interfaccia utente e gestisci ancora gli stessi concetti di base di Silverlight: associazioni di dati, risorse, stili, modelli ecc. In molti casi, è possibile eseguire il porting di un'app Silverlight semplicemente con using
i nuovi spazi dei nomi, e modificando alcuni punti del codice in cui l'API è stata modificata.
WinRT stesso non ha nulla a che fare con HTML e CSS, e ha relazione con JavaScript solo nel senso che è anche esposto lì, in modo simile a come viene fatto per .NET. Non è necessario occuparsi di HTML / CSS / JS quando si utilizzano le librerie dell'interfaccia utente WinRT nella propria app .NET Metro (beh, immagino, se proprio lo si desidera, è possibile ospitare un WebView
controllo ...). Tutte le tue competenze .NET e Silverlight rimangono molto rilevanti in questo modello di programmazione.