Auf der untersten Ebene ist WinRT ein Objektmodell, das auf ABI-Ebene definiert ist. Es verwendet COM als Basis (also implementiert IUnknown
und führt jedes WinRT-Objekt eine Nachzählung durch) und erstellt von dort aus. Im Vergleich zu alten COM-Konzepten, von denen die meisten direkt aus .NET stammen, werden viele neue Konzepte hinzugefügt. Das WinRT-Objektmodell verfügt beispielsweise über Delegaten, und Ereignisse werden im .NET-Stil ausgeführt (mit Delegaten und Abonnenten hinzufügen / entfernen) Methoden, eine pro Ereignis) anstelle des alten COM-Modells für Ereignisquellen und -senken. Von anderen bemerkenswerten Dingen hat WinRT auch parametrisierte ("generische") Schnittstellen.
Eine weitere große Änderung besteht darin, dass für alle WinRT-Komponenten Metadaten verfügbar sind, genau wie für .NET-Assemblys. In COM hatten Sie das irgendwie mit Typelibs, aber nicht jede COM-Komponente hatte sie. Für WinRT sind die Metadaten in .winmd-Dateien enthalten. Sehen Sie in der Entwicklervorschau unter "C: \ Programme (x86) \ Windows Kits \ 8.0 \ Windows-Metadaten \" nach. Wenn Sie herumstöbern, werden Sie feststellen, dass es sich tatsächlich um CLI-Assemblys ohne Code handelt, sondern nur um Metadatentabellen. Sie können sie tatsächlich mit ILDASM öffnen. Beachten Sie, dass dies nicht bedeutet, dass WinRT selbst verwaltet wird - es verwendet einfach das Dateiformat.
Dann gibt es eine Reihe von Bibliotheken, die in Bezug auf dieses Objektmodell implementiert sind und WinRT-Schnittstellen und -Klassen definieren. Sehen Sie sich erneut den oben genannten Ordner "Windows-Metadaten" an, um zu sehen, was sich dort befindet. oder starten Sie einfach den Objektbrowser in VS und wählen Sie "Windows 8.0" in der Framework-Auswahl, um zu sehen, was behandelt wird. Es gibt viel, und es geht nicht nur um die Benutzeroberfläche - Sie erhalten auch Namespaces wie Windows.Data.Json
, oder Windows.Graphics.Printing
, oder Windows.Networking.Sockets
.
Dann erhalten Sie mehrere Bibliotheken, die sich speziell mit der Benutzeroberfläche befassen - meistens handelt es sich dabei um verschiedene Namespaces unter Windows.UI
oder Windows.UI.Xaml
. Viele von ihnen sind den WPF / Silverlight-Namespaces sehr ähnlich - z. B. stimmen sie Windows.UI.Xaml.Controls
eng überein System.Windows.Controls
; das Gleiche gilt für Windows.UI.Xaml.Documents
etc.
Jetzt kann .NET WinRT-Komponenten direkt referenzieren, als wären sie .NET-Assemblys. Dies funktioniert anders als bei COM Interop - Sie benötigen keine Zwischenartefakte wie Interop-Assemblys, sondern nur /r
eine .winmd-Datei, und alle Typen und ihre Mitglieder in ihren Metadaten werden für Sie sichtbar, als wären sie .NET-Objekte. Beachten Sie, dass die WinRT-Bibliotheken selbst vollständig nativ sind (und daher native C ++ - Programme, die WinRT verwenden, überhaupt keine CLR benötigen) - die Magie, all das verwaltete Material verfügbar zu machen, befindet sich in der CLR selbst und ist ziemlich niedrig. Wenn Sie ein .NET-Programm verwenden, das auf eine .winmd-Datei verweist, werden Sie feststellen, dass es tatsächlich wie eine externe Assembly-Referenz aussieht - es gibt keine handlichen Tricks wie das Einbetten von Typen.
Es ist auch keine stumpfe Zuordnung - CLR versucht, WinRT-Typen nach Möglichkeit an ihre Entsprechungen anzupassen. So zB GUIDs, Termine und URIs werden System.Guid
, System.DateTime
und System.Uri
sind; WinRT-Erfassungsschnittstellen wie IIterable<T>
und IVector<T>
werden IEnumerable<T>
und IList<T>
; und so weiter. Dies geht in beide Richtungen: Wenn Sie ein implementiertes .NET-Objekt IEnumerable<T>
haben und es an WinRT zurückgeben, wird es als angezeigt IIterable<T>
.
Dies bedeutet letztendlich, dass Ihre .NET Metro-Apps Zugriff auf eine Teilmenge der vorhandenen Standard-.NET-Bibliotheken sowie auf (native) WinRT-Bibliotheken erhalten, von denen einige - insbesondere Windows.UI
- Silverlight in Bezug auf die API sehr ähnlich sehen. Sie haben immer noch XAML, um Ihre Benutzeroberfläche zu definieren, und Sie beschäftigen sich immer noch mit denselben Grundkonzepten wie in Silverlight - Datenbindungen, Ressourcen, Stile, Vorlagen usw. In vielen Fällen ist es möglich, eine Silverlight-App einfach über using
die neuen Namespaces zu portieren. und Optimieren einiger Stellen im Code, an denen die API angepasst wurde.
WinRT selbst hat nichts mit HTML und CSS zu tun und hat nur in dem Sinne eine Beziehung zu JavaScript, dass es auch dort verfügbar gemacht wird, ähnlich wie es für .NET gemacht wird. Sie müssen sich nicht mit HTML / CSS / JS befassen, wenn Sie WinRT-UI-Bibliotheken in Ihrer .NET Metro-App verwenden (ich denke, wenn Sie wirklich wollen, können Sie ein WebView
Steuerelement hosten ...). Alle Ihre .NET- und Silverlight-Kenntnisse bleiben in diesem Programmiermodell sehr relevant.