Au niveau le plus bas, WinRT est un modèle objet défini au niveau ABI. Il utilise COM comme base (donc chaque objet WinRT implémente IUnknown
et effectue le recomptage) et construit à partir de là. Il ajoute beaucoup de nouveaux concepts par rapport à COM des anciens, dont la plupart proviennent directement de .NET - par exemple, le modèle d'objet WinRT a des délégués, et les événements sont effectués de style .NET (avec des délégués et ajout / suppression d'abonné méthodes, une par événement) plutôt que l'ancien modèle COM de sources et récepteurs d'événements. Parmi d'autres choses notables, WinRT a également des interfaces paramétrées ("génériques").
Un autre grand changement est que tous les composants WinRT ont des métadonnées disponibles pour eux, tout comme les assemblys .NET. Dans COM, vous en aviez en quelque sorte avec les listes de types, mais tous les composants COM n'en avaient pas. Pour WinRT, les métadonnées sont contenues dans des fichiers .winmd - regardez à l'intérieur de "C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" dans Developer Preview. Si vous fouillez, vous verrez que ce sont en fait des assemblys CLI sans code, juste des tables de métadonnées. Vous pouvez les ouvrir avec ILDASM, en fait. Remarque, cela ne signifie pas que WinRT lui-même est géré - il réutilise simplement le format de fichier.
Ensuite, il existe un certain nombre de bibliothèques implémentées en termes de ce modèle d'objet - définissant les interfaces et les classes WinRT. Encore une fois, regardez le dossier "Windows Metadata" mentionné ci-dessus pour voir ce qu'il y a; ou lancez simplement l'Explorateur d'objets dans VS et sélectionnez "Windows 8.0" dans le sélecteur de framework, pour voir ce qui est couvert. Il y a beaucoup de choses là-bas, et cela ne concerne pas uniquement l'interface utilisateur - vous obtenez également des espaces de noms tels que Windows.Data.Json
, ou Windows.Graphics.Printing
, ou Windows.Networking.Sockets
.
Ensuite, vous obtenez plusieurs bibliothèques, qui traitent spécifiquement de l'interface utilisateur - la plupart du temps, il s'agirait de divers espaces de noms sous Windows.UI
ou Windows.UI.Xaml
. Beaucoup d'entre eux sont très similaires aux espaces de noms WPF / Silverlight - par exemple, ils Windows.UI.Xaml.Controls
correspondent étroitement System.Windows.Controls
; idem pour Windows.UI.Xaml.Documents
etc.
Désormais, .NET a la possibilité de référencer directement les composants WinRT comme s'il s'agissait d'assemblages .NET. Cela fonctionne différemment de COM Interop - vous n'avez pas besoin d'artefacts intermédiaires tels que des assemblys d'interopérabilité, vous n'avez qu'un /r
fichier .winmd, et tous les types et leurs membres dans ses métadonnées deviennent visibles pour vous comme s'il s'agissait d'objets .NET. Notez que les bibliothèques WinRT elles-mêmes sont entièrement natives (et donc les programmes C ++ natifs qui utilisent WinRT ne nécessitent pas du tout CLR) - la magie pour exposer tout ce qui est géré se trouve à l'intérieur du CLR lui-même, et est assez bas. Si vous identifiez un programme .NET qui fait référence à un .winmd, vous verrez qu'il ressemble en fait à une référence d'assembly externe - il n'y a aucun tour de passe-passe tel que l'incorporation de type.
Ce n'est pas non plus un mappage brutal - CLR essaie d'adapter les types WinRT à leurs équivalents, si possible. Ainsi, par exemple, les GUID, les dates et les URI deviennent respectivement System.Guid
, System.DateTime
et System.Uri
; Interfaces de collecte WinRT telles que IIterable<T>
et IVector<T>
deviennent IEnumerable<T>
et IList<T>
; etc. Cela va dans les deux sens - si vous avez un objet .NET qui implémente IEnumerable<T>
et le transmettez à WinRT, il le verra comme IIterable<T>
.
En fin de compte, cela signifie que vos applications .NET Metro ont accès à un sous-ensemble des bibliothèques .NET standard existantes, ainsi qu'à des bibliothèques WinRT (natives), dont certaines - en particulier Windows.UI
- ressemblent beaucoup à Silverlight, au niveau de l'API. Vous avez toujours XAML pour définir votre interface utilisateur, et vous traitez toujours les mêmes concepts de base que dans Silverlight - liaisons de données, ressources, styles, modèles, etc. Dans de nombreux cas, il est possible de porter une application Silverlight simplement par using
les nouveaux espaces de noms, et peaufiner quelques endroits dans le code où l'API a été ajustée.
WinRT lui-même n'a rien à voir avec HTML et CSS, et il n'a de relation avec JavaScript que dans le sens où il y est également exposé, de la même manière que cela est fait pour .NET. Vous n'avez pas besoin de gérer HTML / CSS / JS lorsque vous utilisez les bibliothèques d'interface utilisateur WinRT dans votre application .NET Metro (enfin, je suppose que si vous le voulez vraiment, vous pouvez héberger un WebView
contrôle ...). Toutes vos compétences .NET et Silverlight restent très pertinentes dans ce modèle de programmation.