Ответ 1
Что касается №1, состав будет примерно следующим:
JavaScript - высокоуровневый, динамически типизированный, GC. Вы можете использовать HTML5/CSS только для вашего пользовательского интерфейса, инфраструктура XAML (пространство имен Windows.UI.XAML
) недоступна. Предоставляет некоторые стандартные JS API (указанные HTML5) в дополнение к доступной поверхности WinRT, например, локальному хранилищу или IndexedDB. Будучи динамически типизированным, тяжелая обработка с привязкой к процессору, вероятно, будет медленнее, чем .NET или С++, хотя механизм JS все еще очень быстр из-за того, что JIT-скомпилирован и сильно оптимизирован. Вы можете использовать компоненты С++ и .NET WinRT, но не писать свои собственные в JS. Некоторые аспекты языковой проекции кажутся ограниченными соответственно. насколько я вижу, нет способа реализовать интерфейс WinRT в JS, например. Существующие JS-библиотеки обычно могут быть повторно использованы без каких-либо или минимальных усилий, если они работают в IE10.
.NET(С#/VB) - средний уровень, статически типизированный с возможностью динамического ввода (dynamic
ключевое слово и т.д.) и GC. Рамка пользовательского интерфейса XAML является стандартным для пользовательского интерфейса, но вы также можете использовать HTML с помощью элемента управления WebView
. Обеспечивает полный доступ к библиотекам WinRT, но также и некоторые из них, которые иногда более удобны в использовании (например, Stream
vs IInputStream
/IOutputStream
). Кроме того, единственная, которая включает специальную поддержку на уровне языка для асинхронных операций (ключевые слова async
и await
), которые сильно используются при использовании WinRT API из-за их асинхронного дизайна. Вообще говоря, обеспечивает большинство синтаксического сахара - кроме асинхронных вещей, вы получаете LINQ для объектов (которые работают над коллекциями WinRT). Можно написать свои собственные компоненты WinRT, которые затем могут быть использованы из JS или С++/CX. Существующие библиотеки .NET могут или не могут быть легко повторно использованы, в зависимости от того, на каких классах в .NET Framework они полагаются; компоненты, написанные для Silverlight или WP7, скорее всего, будут повторно использоваться без каких-либо или минимальных изменений, тогда как компоненты, написанные для .NET 4 Full или Client Profile, могут потребовать значительных изменений для запуска.
С++/CX (Visual С++ Component Extensions) - низко/среднеуровневый, статически типизированный, без GC-refcounting. Ближайшее "к металлу" в том, что его объектная модель предназначена для непосредственной привязки к WinRT без несоответствия импеданса - следовательно, для пересчета - но все еще достаточно высокого уровня, чтобы избежать шаблона и быть в целом безопасным для использования (например, исключения, а не HRESULT, строки, видимые как объекты, а не ручки, dynamic_cast
, а не QueryInterface
и т.д.). Никаких дополнительных уровней, прокси-объектов и т.д. Между вами и WinRT, все вызовы являются прямыми. В большинстве случаев, самый быстрый из всех трех, хотя точная разница значительно варьируется в зависимости от конкретной задачи и может быть незначительной для некоторых (например, приложение с ведомым событием без каких-либо или небольших вычислений) и значительным для других (например, синтаксический анализ или тяжелая математика). История пользовательского интерфейса такая же, как и для .NET. Кроме того, вы получаете всю стандартную библиотеку С++, доступную для вас, а также подмножество ATL. Можно написать свои собственные компоненты WinRT, которые затем могут использоваться из JS или .NET. Существующие библиотеки С++ могут или не могут быть легко повторно использованы в зависимости от того, какие API они используют; те, которые полагаются строго на стандарт C/С++, обычно работают без изменений, в то время как те, которые вызывают API Win32, могут представлять проблему, если они полагаются на API, недоступные в контейнере приложений Metro.
Что касается №3, это видео - http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C - должно отвечать на большинство ваших вопросов относительно использования Win32 (что я предполагаю, что "низкоуровневая DLL" означает) из приложений Metro. Обратите внимание, что, хотя видеоролик о С++, это также полностью относится к С#, поскольку P/Invoke и COM Interop все еще существуют. Поэтому, если вы можете вызвать его из С++, вы можете вызвать его из С#.