На самом низком уровне 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 \» в Developer Preview. Если вы поэкспериментируете, то увидите, что это на самом деле сборки CLI без кода, а только таблицы метаданных. Вы можете открыть их с ILDASM, на самом деле. Обратите внимание, это не означает, что WinRT управляется сам - он просто повторно использует формат файла.
Затем существует ряд библиотек, реализованных в рамках этой объектной модели - определение интерфейсов и классов WinRT. Снова, посмотрите на папку Windows Metadata, упомянутую выше, чтобы увидеть, что там; или просто запустите Object Browser в 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; То же самое Windows.UI.Xaml.Documentsи т. д.
Теперь .NET имеет возможность напрямую ссылаться на компоненты WinRT, как если бы они были сборками .NET. Это работает иначе, чем COM Interop - вам не нужны какие-либо промежуточные артефакты, такие как сборки взаимодействия, вы просто /rфайл .winmd, и все типы и их члены в его метаданных становятся видимыми вам, как если бы они были объектами .NET. Обратите внимание, что библиотеки WinRT сами по себе являются полностью нативными (и поэтому нативным программам на C ++, использующим WinRT, вообще не требуется CLR) - магия для раскрытия всего, что управляется, находится внутри самой CLR и является довольно низким уровнем. Если вы ildasm .NET-программы, которая ссылается на .winmd, вы увидите, что на самом деле она выглядит как внешняя ссылка на сборку - здесь нет хитрости в ручном обмане, таком как встраивание типов.
Это также не тупое отображение - CLR пытается адаптировать типы WinRT к их эквивалентам, где это возможно. Так, например, GUID, даты и 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 остаются очень важными в этой модели программирования.