На самом низком уровне WinRT — это объектная модель, определенная на уровне ABI. Он использует COM в качестве основы (поэтому каждый объект WinRT реализует IUnknown и выполняет подсчет ссылок) и строит оттуда. Он добавляет довольно много новых концепций по сравнению со старой COM, большинство из которых происходит непосредственно из .NET — например, объектная модель WinRT имеет делегатов, а события выполняются в стиле .NET (с делегатами и добавлением/удалением подписчика). методы, по одному на событие), а не старую COM-модель источников и приемников событий. Из других примечательных особенностей WinRT также имеет параметризованные («универсальные») интерфейсы.
Еще одно большое изменение заключается в том, что для всех компонентов WinRT доступны метаданные, как и для сборок .NET. В COM у вас было что-то вроде библиотеки типов, но не у каждого компонента COM они были. Для WinRT метаданные содержатся в файлах .winmd — загляните внутрь «C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata\» в Developer Preview. Если вы поковыряетесь, то увидите, что на самом деле это CLI-сборки без кода, только таблицы метаданных. На самом деле вы можете открыть их с помощью ILDASM. Обратите внимание: это не означает, что WinRT является управляемым — он просто повторно использует формат файла.
Кроме того, существует ряд библиотек, реализованных в терминах этой объектной модели, определяющих интерфейсы и классы WinRT. Опять же, посмотрите на папку «Метаданные Windows», упомянутую выше, чтобы увидеть, что там; или просто запустите 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-взаимодействие — вам не нужны какие-либо промежуточные артефакты, такие как сборки взаимодействия, вы просто создаете /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 в своем приложении .NET Metro (ну, я думаю, если вы действительно этого хотите, вы можете разместить элемент управления WebView...). Все ваши навыки работы с .NET и Silverlight остаются весьма актуальными в этой модели программирования.
person
Pavel Minaev
schedule
14.09.2011
Windows.*пространства имен. Пока что терминология здесь несколько сбивает с толку, поскольку WinRT относится как к технологии, так и ко всему набору стандартных библиотек. Я не думаю, что есть какая-то краткая метка только для библиотек пользовательского интерфейса (Windows.UI.*). - person Pavel Minaev   schedule 15.09.2011