Как Windows 8 Runtime (WinRT / приложения Магазина Windows / универсальное приложение Windows 10) сравнивается с Silverlight и WPF? [закрыто]

353

Я пытаюсь получить мою голову вокруг новой ОС Windows 8 Время воспроизведения , который используется для создания Metro - приложений в стиле. Я знаю, что вы можете использовать его с XAML, и он основан на .NET, так что C # и VB.NET можно использовать для написания приложений, но тогда, похоже, это как-то связано с HTML, CSS, DOM и JavaScript.

Может ли кто-нибудь объяснить, что это такое, в нескольких абзацах, в терминах, понятных программисту .NET UI? (Я упускаю что-то «ключевое», что необходимо, чтобы понять это.)


Мы все знаем, что WPF, Silverlight , Windows Forms и т. Д. Будут работать под Windows 8 (и Windows 10) хотя бы на системах Intel, поэтому, пожалуйста, не говорите мне об этом ...

Ян Рингроз
источник
22
Он не основан на .NET, только доступен (немного похож на COM-взаимодействие, но гораздо более плавный ... например, нет сборок взаимодействия).
Павел Минаев
Вы запрашиваете WinRT в качестве платформы (ABI, объектная модель и т. Д.) - в этом случае имеет смысл сравнить ее с COM или .NET - или с библиотеками стандартных классов WinRT, в том числе для UI?
Павел Минаев
1
Обратите внимание, что вы должны различать базовую технологию, объектную модель и т. Д. - аналогично, например, COM - и конкретные библиотеки, реализованные с использованием этой технологии. Даже в последнем случае не все стандартные библиотеки являются библиотеками пользовательского интерфейса - если вы посмотрите на Object Browser в VS, вы увидите широкий спектр функций, Windows.*охватывающих пространства имен. Терминология до сих пор несколько запутанная, поскольку WinRT относится как к технологии, так и ко всему набору стандартных библиотек. Я не думаю, что есть какая-то краткая метка только для библиотек пользовательского интерфейса ( Windows.UI.*).
Павел Минаев
@TrueWill: имеет больше смысла изучать все три, так что ваши знания будут более всесторонними, и вы сможете решить, какое решение лучше для данной проблемы. Не просто выучить одно из трех.
Крис Чарабарук
2
@TrueWill: у Silverlight не будет никаких будущих выпусков: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/…
Sabuncu

Ответы:

479

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

Павел Минаев
источник
Как насчет совместимости WPF-WinRT? Будут ли в WPF-Silverlight какие-то несоответствия?
День
5
@Den WPF не является хорошей отправной точкой для сравнения - API намного, намного ближе к Silverlight. Если вы посмотрите на это так, между ними есть несоответствия, но масштаб ближе к рабочему столу против WP7 Silverlight, а не Silverlight против WPF.
Павел Минаев
11
Отличный ответ. WinRT напрямую обращается к ядру NT (когда ему нужна поддержка ОС) или проходит через Win32?
Тимор
4
Небольшое исправление / дополнение: компонент WinRT реализует интерфейс IInspectable, который происходит от IUnknown ...
Мартин Ба,
66

Из основного лота Build :

Основной стек

Они предоставляют общие API для приложений HTML / CSS / JavaScript и приложений C # / XAML. Будут использоваться C # и XAML, но это не будет точно WPF или Silverlight.

RandomEngy
источник
8
Это немного сложнее, поскольку новая XAML-версия доступна как для C #, так и (для нативного) C ++. Это не WPF и не Silverlight, но очень близко к последнему - как показано в ключевой заметке, вы часто можете просто изменить некоторые использования и другие подобные банальные рефакторинги в существующем коде Silverlight. Основные идеи WPF / Silverlight - декларативная разметка, ресурсы, стили, шаблоны, привязки данных и т. Д. - все это есть. Большинство элементов управления также есть.
Павел Минаев
2
Есть лучшее изображение, которое я видел этим утром, но я просто не могу найти его снова. РЕДАКТИРОВАТЬ: Найдено, благодаря еще один ответ на этот вопрос. dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Крис Чарабарук
1
Где WPF помещается на слайде?
Папараццо
1
Он сгруппирован вместе с .NET / Silverlight в правом нижнем углу.
BoltClock
1
Эта картина в корне неверна с точки зрения существующих произведений. Вы можете почти исправить это, заменив «Службы ядра Windows» на «Win32 kernel32.dll» и «Win32» на «Win32 user32.dll + gdi32.dll» ... но IE и .NET / Silverlight должны располагаться в основном сверху. из user32.dll + gdi32.dll, а также C / C ++ / Java / Delphi / и т. д. также доходят до kernel32.dll. Важно то, что user32.dll и gdi32.dll НЕ лежат в основе WinRT, и что приложения Магазина Windows не могут пройти мимо WinRT прямо на полную мощность kernel32.dll.
Бен Фойгт
37

Ключевая идея заключается в том, что сейчас есть два пути разработки - Desktop и Metro.

  • На рабочем столе живут старые приложения.
  • Новый класс приложений, Metro-приложения, можно создавать несколькими способами, в том числе с помощью VB.NET, C # или C ++. Эти три языковых опции могут использовать XAML для создания пользовательского интерфейса. Альтернативой является использование JavaScript / HTML5 / CSS для разработки как пользовательского интерфейса, так и кода приложения.

Некоторые важные моменты:

  • Windows 8 выглядит как расширенная ОС для мобильных телефонов.
  • В Metro нет перекрывающихся окон верхнего уровня, как и на мобильном телефоне. Если вы хотите приложение в стиле MDI, вам нужно оставаться на рабочем столе.
  • Приложения в стиле Metro автоматически приостанавливаются, когда их не видно. Это было сделано для продления срока службы батареи. Это означает, что для многих существующих настольных приложений, которые выполняют фоновую обработку, даже если пользователь не взаимодействует с ними, перенос в Metro невозможен.
  • ARM-версия Windows 8 не будет поддерживать настольные приложения. Так что, если вы хотите написать приложение и хотите, чтобы оно работало на любой версии Windows, тогда это должно быть приложение Metro.
dodgy_coder
источник
2
В метро нет перекрывающихся окон верхнего уровня . Все еще есть Popup( msdn.microsoft.com/en-us/library/windows/apps/… ), так что если вы хотите, вы можете приготовить что-нибудь, похожее на MDI. Очевидно, что не рекомендуется злоупотреблять этим, так как вы рискуете получить непринужденный сенсорный интерфейс.
Павел Минаев
@Pavel - это интересно - значит ли это, что у вас может быть несколько окон верхнего уровня, работающих бок о бок, но не перекрывающихся друг с другом? например кафельный ... разделяя половину экрана каждый например? Приложение WPF, над которым я сейчас работаю, нуждается в такого рода функциональности.
dodgy_coder
3
Каждое приложение Metro имеет только одно окно верхнего уровня. У вас может быть два приложения Metro, запущенных бок о бок, но это то, что пользователь решает - приложение не может заставить себя войти в эту конфигурацию. Более того, даже если у вас два приложения, работающие рядом, они не могут взаимодействовать с координатами (кроме как с помощью явных пользовательских жестов, таких как «Поделиться»).
Павел Минаев
1
С другой стороны, вы можете, конечно, разделить свое собственное окно верхнего уровня на столько областей, сколько захотите, и предоставить подвижный разделитель для изменения их размера - который, с точки зрения пользователя, будет выглядеть как два плиточных окна верхнего уровня , Они все равно будут отображаться как одна вещь в переключателе приложений (но тогда вы, вероятно, захотите это сделать?).
Павел Минаев
3
По словам Мартина Ловелла, для этого нет никакого преднамеренного механизма, и некоторые из них, которые могут быть использованы для него, намеренно ограничены. Например, именованных каналов там нет, равно как и файлы с отображением в памяти. Есть сокеты (в том числе серверные), но при подключении localhostвы можете подключиться только к одному приложению. Вы можете использовать обычные файлы в одной из общих «известных папок» («Документы», «Изображения» и т. Д.), Но это довольно грубый взлом, который требует опроса и виден пользователю.
Павел Минаев
24

Есть модифицированная версия архитектуры, которая, несомненно, поможет вам понять, где именно находятся вещи. Один из ниндзя Telerik поболтал с командой CLR и изменил картинку:

Платформа и инструменты Windows 8 (включая CLR)

Здесь вы можете увидеть, где стоит CLR. .NET Framework теперь имеет два профиля

1- .NET Metro профиль (CLR, который имеет дело с приложением Metro)

2- Профиль клиента .NET (среда выполнения CLR для приложений на C # и VB.NET)

Я надеюсь, что это дает вам более четкую картину. Прочитайте статью полностью в Плохая картина стоит тысячи долгих обсуждений. ,

vendettamit
источник
17

Много подробностей от Microsoft здесь .

Среда выполнения Windows предоставляется с использованием метаданных API (файлы .winmd). Это тот же формат, который используется в .NET Framework (Ecma-335). Базовый бинарный контракт упрощает доступ к API среды выполнения Windows напрямую на выбранном вами языке разработки. Форма и структура API среды выполнения Windows могут быть понятны как статическим языкам, таким как C #, так и динамическим языкам, таким как JavaScript. IntelliSense доступен в JavaScript, C #, Visual Basic и C ++.

Короче говоря, Windows Runtime - это новый набор библиотек, представляющих функциональность Windows и доступных для JavaScript / C # / VB / C ++. Каждый язык был сделан, чтобы понимать и иметь возможность называть их напрямую, вместо того, чтобы проходить через какой-то громоподобный слой.

Silverlight и WPF - это разновидности XAML, которые работают на CLR. Помимо других функций, среда выполнения Windows предоставляет версию XAML, очень похожую на Silverlight, но делает это встроенным способом, а не через CLR. Доступ к нему можно получить как из CLR, так и из C ++.

Стив Роу
источник
2
Может присутствовать «громоподобный слой» - например, CLR фактически использует RCW - но сейчас это деталь реализации. С точки зрения разработчика, вы напрямую ссылаетесь на файлы WinRT .winmd и работаете напрямую с внутренними типами.
Павел Минаев
3
В то время как слой thunking использует RCW, RCW для среды выполнения Windows более легкие, чем старые P / Invoke RCW.
Восстановить Монику Ларри Остерман