На самом низком уровне 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 остаются очень важными в этой модели программирования.