На найнижчому рівні WinRT - це об'єктна модель, визначена на рівні ABI. Він використовує COM в якості основи (тому кожен об’єкт WinRT реалізує IUnknown
та робить перерахунок) і будує звідти. Це додає досить багато нових понять порівняно зі старими COM, більшість з яких надходить безпосередньо з .NET - наприклад, об’єктна модель WinRT має делегатів, а події виконуються у стилі .NET (з делегатами та додавання / видалення підписника методів, по одному на подію), а не старої моделі COM джерел подій та раковин. Серед інших помітних речей, WinRT також має параметризовані ("загальні") інтерфейси.
Ще одна велика зміна полягає в тому, що всі компоненти WinRT мають для них метадані, як і .NET збірки. У COM у вас щось на зразок було з typelibs, але не кожен компонент COM мав їх. Для WinRT метадані містяться у файлах .winmd - загляньте всередину "C: \ Program Files (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" у Preview Developer Preview. Якщо ти замислишся, то побачиш, що це насправді збірки CLI без коду, просто таблиці метаданих. Ви можете відкрити їх за допомогою ILDASM. Зауважте, це не означає, що самим WinRT управляється - він просто повторно використовує формат файлу.
Тоді існує ряд бібліотек, реалізованих з точки зору цієї об'єктної моделі - що визначає інтерфейси та класи WinRT. Знову подивіться згадану вище папку "Метадані Windows", щоб побачити, що там є; або просто запустіть браузер об’єктів у VS та виберіть "Windows 8.0" у селекторі фреймворків, щоб побачити, що охоплюється. Там багато, і це не стосується лише інтерфейсу користувача - ви також отримуєте простори імен, наприклад Windows.Data.Json
, або Windows.Graphics.Printing
, або Windows.Networking.Sockets
.
Потім ви отримуєте кілька бібліотек, які спеціально мають справу з інтерфейсом користувача - переважно це будуть різні простори імен під Windows.UI
або Windows.UI.Xaml
. Багато з них дуже схожі на простори імен WPF / Silverlight - наприклад Windows.UI.Xaml.Controls
, тісно співпадають System.Windows.Controls
; ditto for Windows.UI.Xaml.Documents
etc.
Тепер .NET має можливість безпосередньо посилатися на компоненти WinRT так, ніби вони були .NET збірками. Це працює інакше, ніж COM Interop - вам не потрібні проміжні артефакти, такі як збірки interop, ви просто /r
.winmd файл, і всі типи та їх члени в його метаданих стають вам видимими, ніби вони об’єктами .NET. Зауважте, що самі бібліотеки WinRT є повністю рідними (і тому рідні програми C ++, які використовують WinRT, взагалі не потребують CLR) - магія розкривати всі ті речі, як керовані, всередині самого CLR, і досить низький рівень. Якщо ви ildasm .NET програма, яка посилається на .winmd, ви побачите, що це насправді схоже на зовнішню посилання на збірку - немає хитрості хитрощів, таких як вбудовування типу.
Це теж не тупе відображення - CLR намагається адаптувати типи WinRT до їх еквівалентів, де це можливо. Так наприклад GUIDs, дата і ідентифікатори URI стають System.Guid
, System.DateTime
і System.Uri
, відповідно; Інтерфейси колекції WinRT, такі як IIterable<T>
і IVector<T>
стати IEnumerable<T>
та IList<T>
; і так далі. Це іде обома способами - якщо у вас є .NET-об’єкт, який реалізує IEnumerable<T>
, і передати його назад WinRT, він побачить це як IIterable<T>
.
Зрештою, це означає, що ваші додатки .NET Metro отримують доступ до підмножини існуючих стандартних бібліотек .NET, а також до (рідних) бібліотек WinRT, деякі з яких - особливо Windows.UI
- дуже схожі на Silverlight, що відповідає API. У вас все ще є XAML для визначення вашого інтерфейсу, і ви все ще маєте справу з тими ж основними поняттями, що і в Silverlight - прив'язки даних, ресурсів, стилів, шаблонів тощо. У багатьох випадках можливо перенести додаток Silverlight просто за using
допомогою нових просторів імен, і налаштувати декілька місць у коді, де налаштовано API.
Сам WinRT не має нічого спільного з HTML та CSS, і він має відношення до JavaScript лише в тому сенсі, що він також там відкритий, як і для .NET. Вам не потрібно мати справу з HTML / CSS / JS, коли ви використовуєте бібліотеки інтерфейсу WinRT UI у вашому додатку .NET Metro (ну, мабуть, якщо ви дійсно хочете, ви можете розмістити WebView
контроль ...). Усі ваші навички .NET і Silverlight залишаються дуже актуальними в цій моделі програмування.