Na najniższym poziomie WinRT jest modelem obiektowym zdefiniowanym na poziomie ABI. Wykorzystuje COM jako bazę (więc każdy obiekt WinRT implementuje IUnknown
i przelicza) i stamtąd buduje. Dodaje całkiem sporo nowych koncepcji w porównaniu do COM starych, z których większość pochodzi bezpośrednio z .NET - na przykład model obiektowy WinRT ma delegatów, a zdarzenia są wykonywane w stylu .NET (z delegatami i dodawanie / usuwanie subskrybenta metody, jedna na zdarzenie) zamiast starego modelu COM źródeł zdarzeń i ujść. Oprócz innych ważnych rzeczy WinRT ma również sparametryzowane („ogólne”) interfejsy.
Kolejną dużą zmianą jest to, że wszystkie komponenty WinRT mają dostępne dla nich metadane, podobnie jak zestawy .NET. W COM masz coś takiego z typelibami, ale nie każdy składnik COM je miał. W przypadku WinRT metadane są zawarte w plikach .winmd - zajrzyj do „C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Windows Metadata \” w Preview Developer. Jeśli się rozejrzysz, zobaczysz, że w rzeczywistości są to zestawy CLI bez kodu, tylko tabele metadanych. W rzeczywistości można je otworzyć za pomocą ILDASM. Uwaga: nie oznacza to, że sam WinRT jest zarządzany - po prostu ponownie używa formatu pliku.
Następnie istnieje wiele bibliotek zaimplementowanych w ramach tego modelu obiektowego - definiujących interfejsy i klasy WinRT. Ponownie spójrz na wspomniany wyżej folder „Metadane Windows”, aby zobaczyć, co tam jest; lub po prostu uruchom Przeglądarkę obiektów w VS i wybierz „Windows 8.0” w selektorze ram, aby zobaczyć, co jest objęte. Jest tam dużo i nie dotyczy tylko interfejsu użytkownika - dostajesz także przestrzenie nazw takie jak Windows.Data.Json
, lub Windows.Graphics.Printing
, lub Windows.Networking.Sockets
.
Następnie dostajesz kilka bibliotek, które konkretnie zajmują się interfejsem użytkownika - głównie byłyby to różne przestrzenie nazw pod Windows.UI
lub Windows.UI.Xaml
. Wiele z nich jest bardzo podobnych do przestrzeni nazw WPF / Silverlight - np. Windows.UI.Xaml.Controls
Jest ściśle dopasowana System.Windows.Controls
; to samo dotyczy Windows.UI.Xaml.Documents
itp.
Teraz .NET ma możliwość bezpośredniego odwoływania się do komponentów WinRT, tak jakby były one zestawami .NET. Działa to inaczej niż COM Interop - nie potrzebujesz żadnych pośrednich artefaktów, takich jak zespoły /r
interopów, wystarczy plik .winmd, a wszystkie typy i ich elementy w jego metadanych stają się dla ciebie widoczne, jakby były obiektami .NET. Zauważ, że same biblioteki WinRT są w pełni natywne (a więc natywne programy C ++ korzystające z WinRT wcale nie wymagają CLR) - magia ujawnienia wszystkich zarządzanych rzeczy jest w samym CLR i jest dość niska. Jeśli zdemaskujesz program .NET, który odwołuje się do .winmd, zobaczysz, że faktycznie wygląda on jak zewnętrzne odwołanie do zestawu - nie ma w tym sztuczki polegającej na ręcznym podstępowaniu, takim jak osadzanie typu.
Nie jest to również mapowanie tępe - CLR próbuje dostosować typy WinRT do ich odpowiedników, tam gdzie to możliwe. Tak np GUID, daty i URI stać System.Guid
, System.DateTime
i System.Uri
, odpowiednio; Interfejsy kolekcji WinRT jak IIterable<T>
i IVector<T>
stały IEnumerable<T>
i IList<T>
; i tak dalej. Działa to w obie strony - jeśli masz obiekt .NET, który implementuje IEnumerable<T>
i przekaże go z powrotem do WinRT, zobaczy to jako IIterable<T>
.
Ostatecznie oznacza to, że Twoje aplikacje .NET Metro mają dostęp do podzbioru istniejących standardowych bibliotek .NET, a także (rodzimych) bibliotek WinRT, z których niektóre - szczególnie Windows.UI
- wyglądają bardzo podobnie do Silverlight, pod względem API. Nadal masz XAML do zdefiniowania interfejsu użytkownika i nadal masz do czynienia z tymi samymi podstawowymi pojęciami, co w Silverlight - powiązania danych, zasoby, style, szablony itp. W wielu przypadkach możliwe jest przeniesienie aplikacji Silverlight po prostu przez using
nowe przestrzenie nazw, i poprawianie kilku miejsc w kodzie, w których interfejs API został dostosowany.
Sam WinRT nie ma nic wspólnego z HTML i CSS i ma związek z JavaScript tylko w tym sensie, że jest tam ujawniony, podobnie jak to jest zrobione dla .NET. Nie musisz zajmować się HTML / CSS / JS, gdy używasz bibliotek interfejsu użytkownika WinRT w aplikacji .NET Metro (cóż, myślę, że jeśli naprawdę chcesz, możesz hostować WebView
kontrolę ...). Wszystkie twoje umiejętności .NET i Silverlight pozostają bardzo istotne w tym modelu programowania.