Чем отличается среда выполнения Windows 8 (приложения WinRT/Windows Store/универсальное приложение Windows 10) от Silverlight и WPF?

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

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


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


person Ian Ringrose    schedule 14.09.2011    source источник
comment
Он не основан на .NET, а только открыт для него (немного похож на COM-взаимодействие, но гораздо более бесшовный... например, без сборок взаимодействия).   -  person Pavel Minaev    schedule 14.09.2011
comment
Вы запрашиваете WinRT в качестве платформы (ABI, объектная модель и т. д.) — в этом случае имеет смысл сравнивать ее с COM или .NET — или о стандартных библиотеках классов WinRT, включая библиотеки для пользовательского интерфейса?   -  person Pavel Minaev    schedule 14.09.2011
comment
Обратите внимание, что вы должны различать базовую технологию, объектную модель и т. д. - аналогично, например. COM - и специальные библиотеки, реализованные с использованием этой технологии. Даже в последнем случае не все стандартные библиотеки являются библиотеками пользовательского интерфейса — если вы посмотрите в обозревателе объектов в VS, вы увидите широту функций, которые охватывают Windows.* пространства имен. Пока что терминология здесь несколько сбивает с толку, поскольку WinRT относится как к технологии, так и ко всему набору стандартных библиотек. Я не думаю, что есть какая-то краткая метка только для библиотек пользовательского интерфейса (Windows.UI.*).   -  person Pavel Minaev    schedule 15.09.2011
comment
@TrueWill: имеет смысл изучить все три, чтобы ваши знания были более всесторонними и чтобы вы могли решить, какое решение лучше всего подходит для данной проблемы. Не просто выучить один из трех.   -  person Chris Charabaruk    schedule 21.09.2011
comment
@TrueWill: будущих выпусков Silverlight не будет: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/   -  person Sabuncu    schedule 15.01.2012


Ответы (5)


На самом низком уровне 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
comment
Как насчет совместимости WPF-WinRT? Будут ли несоответствия WPF-Silverlight? - person Den; 15.09.2011
comment
@Den WPF здесь не является хорошей отправной точкой для сравнения - API намного, намного ближе к Silverlight. Если вы посмотрите на это таким образом, между ними есть несоответствия, но масштаб ближе к рабочему столу по сравнению с WP7 Silverlight, а не Silverlight по сравнению с WPF. - person Pavel Minaev; 15.09.2011
comment
Отличный ответ. Получает ли WinRT доступ к ядру NT напрямую (когда ему требуется поддержка ОС) или через Win32? - person Timores; 22.09.2011
comment
Небольшое исправление/дополнение: Компонент WinRT реализует интерфейс IInspectable, производный от IUnknown... - person Martin Ba; 25.10.2011

Из основного доклада Build:

Стопка ключевых заметок

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

person RandomEngy    schedule 14.09.2011
comment
Это немного сложнее, так как новая штука XAML доступна как для C#, так и для (собственного) C++. Это не WPF и не Silverlight, но очень близко к последнему — как было продемонстрировано в основном докладе, часто можно обойтись простым изменением набора вариантов использования и другими подобными тривиальными рефакторингами в существующем коде Silverlight. Основные идеи WPF/Silverlight — декларативная разметка, ресурсы, стили, шаблоны, привязки данных и т. д. — все здесь. Большинство элементов управления там также. - person Pavel Minaev; 15.09.2011
comment
Там есть лучшая графика, которую я видел сегодня утром, но я просто не могу найти ее снова. РЕДАКТИРОВАТЬ: Найдено, благодаря другому ответу на этот вопрос. dougseven.files.wordpress.com/2011/09/win8- новая платформа.png - person Chris Charabaruk; 21.09.2011
comment
Какое место на слайде занимает WPF? - person paparazzo; 17.04.2012
comment
Он сгруппирован вместе с .NET/Silverlight в правом нижнем углу. - person BoltClock; 19.10.2012
comment
Эта картина совершенно неверна по отношению к существующим произведениям. Вы можете почти исправить это, заменив Windows Kernel Services на 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. - person Ben Voigt; 08.05.2013

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

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

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

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

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

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

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

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

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

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

person vendettamit    schedule 17.09.2011

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

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

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

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

person Steve Rowe    schedule 15.09.2011
comment
Уровень thunking может присутствовать - например. CLR фактически использует RCW, но теперь это деталь реализации. С точки зрения разработчика вы напрямую ссылаетесь на файлы WinRT .winmd и работаете напрямую с типами внутри. - person Pavel Minaev; 15.09.2011
comment
В то время как уровень thunking использует RCW, RCW для среды выполнения Windows являются более легкими, чем старые RCW P/Invoke. - person ReinstateMonica Larry Osterman; 15.09.2011