¿Cómo se compara Windows 8 Runtime (aplicaciones WinRT / Windows Store / Windows 10 Universal App) con Silverlight y WPF? [cerrado]

353

Estoy tratando de entender el nuevo Windows 8 Runtime que se usa para crear aplicaciones de estilo Metro . Sé que puede usarlo con XAML y está basado en .NET, por lo que C # y VB.NET pueden usarse para escribir las aplicaciones, pero parece tener algo que ver con HTML, CSS, DOM y JavaScript.

¿Alguien puede explicar qué es en unos pocos párrafos, en términos que un programador de .NET UI pueda entender? (Me falta algo "clave" que es necesario para entenderlo).


Todos sabemos que WPF, Silverlight , Windows Forms , etc. seguirán funcionando bajo Windows 8 (y Windows 10) al menos en los sistemas Intel, así que no me digas eso ...

Ian Ringrose
fuente
22
No se basa en .NET, solo se expone a él (un poco como la interoperabilidad COM, pero mucho más transparente ... por ejemplo, no hay ensamblados de interoperabilidad).
Pavel Minaev
¿Está preguntando por WinRT como plataforma (ABI, modelo de objetos, etc.), en cuyo caso tiene más sentido compararlo con COM o .NET, o sobre las bibliotecas de clases estándar de WinRT, incluidas las de UI?
Pavel Minaev
1
Tenga en cuenta que debe distinguir la tecnología subyacente, el modelo de objetos, etc., similar a, por ejemplo, COM, y las bibliotecas específicas implementadas con esa tecnología. Incluso en el caso de este último, no todas las bibliotecas estándar son bibliotecas de interfaz de usuario; si mira en Object Browser en VS, puede ver la variedad de características que Windows.*cubren los espacios de nombres. Hasta ahora, la terminología es algo confusa, ya que WinRT se refiere tanto a la tecnología como a todo el conjunto de bibliotecas estándar. Sin embargo, no creo que haya una etiqueta concisa solo para las bibliotecas de la interfaz de usuario ( Windows.UI.*).
Pavel Minaev
@TrueWill: tiene más sentido aprender los tres, para que su conocimiento sea más completo y para que pueda decidir qué solución es mejor para un problema determinado. No solo aprendas uno de los tres.
Chris Charabaruk
2
@TrueWill: Silverlight no tendrá lanzamientos futuros: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/…
Sabuncu

Respuestas:

479

En el nivel más bajo, WinRT es un modelo de objetos definido en el nivel ABI. Utiliza COM como base (por lo que cada objeto WinRT implementa IUnknowny realiza el recuento), y construye desde allí. Agrega muchos conceptos nuevos en comparación con los COM de antaño, la mayoría de los cuales provienen directamente de .NET; por ejemplo, el modelo de objetos WinRT tiene delegados y los eventos se realizan al estilo .NET (con delegados y agregar / eliminar suscriptores) métodos, uno por evento) en lugar del antiguo modelo COM de fuentes y sumideros de eventos. De otras cosas notables, WinRT también tiene interfaces parametrizadas ("genéricas").

Otro gran cambio es que todos los componentes WinRT tienen metadatos disponibles para ellos, al igual que los ensamblados .NET. En COM, tenías eso con typelibs, pero no todos los componentes COM los tenían. Para WinRT, los metadatos están contenidos en archivos .winmd. Busque dentro de "C: \ Archivos de programa (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" en Developer Preview. Si hurga, verá que en realidad son ensamblados de CLI sin código, solo tablas de metadatos. Puede abrirlos con ILDASM, de hecho. Tenga en cuenta que esto no significa que WinRT esté administrado, simplemente reutiliza el formato de archivo.

Luego, hay una serie de bibliotecas implementadas en términos de ese modelo de objetos, que definen las interfaces y clases de WinRT. Nuevamente, mire la carpeta "Metadatos de Windows" mencionada anteriormente para ver qué hay allí; o simplemente inicie Object Browser en VS y seleccione "Windows 8.0" en el selector de marco, para ver qué está cubierto. Hay mucho allí, y no se ocupa solo de la interfaz de usuario: también obtienes espacios de nombres como Windows.Data.Json, o Windows.Graphics.Printing, o Windows.Networking.Sockets.

Luego obtienes varias bibliotecas, que se ocupan específicamente de la interfaz de usuario; en su mayoría, estos serían varios espacios de nombres bajo Windows.UIo Windows.UI.Xaml. Muchos de ellos son muy similares a los espacios de nombres de WPF / Silverlight, por ejemplo, Windows.UI.Xaml.Controlscoinciden estrechamente System.Windows.Controls; lo mismo para Windows.UI.Xaml.Documentsetc.

Ahora, .NET tiene la capacidad de hacer referencia directa a los componentes WinRT como si fueran ensamblados .NET. Esto funciona de manera diferente a Interoperabilidad COM: no necesita ningún artefacto intermedio como ensamblajes de interoperabilidad, solo /run archivo .winmd y todos los tipos y sus miembros en sus metadatos se vuelven visibles para usted como si fueran objetos .NET. Tenga en cuenta que las bibliotecas WinRT en sí son completamente nativas (por lo que los programas nativos de C ++ que usan WinRT no requieren CLR en absoluto): la magia para exponer todas esas cosas como se administran está dentro del CLR en sí, y es de nivel bastante bajo. Si ildasm un programa .NET que hace referencia a un .winmd, verás que en realidad se ve como una referencia de ensamblaje externo: no hay un juego de trucos de mano como la incrustación de tipos allí.

Tampoco es un mapeo contundente: CLR intenta adaptar los tipos de WinRT a sus equivalentes, siempre que sea posible. Entonces, por ejemplo, se convierten en GUID, fechas y URI System.Guid, System.DateTimey System.Uri, respectivamente; Interfaces de colección WinRT tales como IIterable<T>y IVector<T>Become IEnumerable<T>y IList<T>; y así. Esto va en ambos sentidos: si tiene un objeto .NET que se implementa IEnumerable<T>y lo devuelve a WinRT, lo verá como IIterable<T>.

En última instancia, lo que esto significa es que sus aplicaciones .NET Metro obtienen acceso a un subconjunto de las bibliotecas .NET estándar existentes, y también a las bibliotecas WinRT (nativas), algunas de las cuales, particularmente Windows.UI, se parecen mucho a Silverlight, API-wise. Todavía tiene XAML para definir su IU, y aún maneja los mismos conceptos básicos que en Silverlight: enlaces de datos, recursos, estilos, plantillas, etc. En muchos casos, es posible portar una aplicación Silverlight simplemente por usinglos nuevos espacios de nombres, y ajustar algunos lugares en el código donde se ajustó la API.

WinRT en sí no tiene nada que ver con HTML y CSS, y tiene relación con JavaScript solo en el sentido de que también está expuesto allí, de manera similar a como se hace para .NET. No necesita lidiar con HTML / CSS / JS cuando usa las bibliotecas WinRT UI en su aplicación .NET Metro (bueno, supongo que si realmente quiere, puede alojar un WebViewcontrol ...). Todas sus habilidades de .NET y Silverlight siguen siendo muy relevantes en este modelo de programación.

Pavel Minaev
fuente
¿Qué pasa con la compatibilidad WPF-WinRT? ¿Habrá inconsistencias de tipo WPF-Silverlight?
Den
55
@Den WPF no es un buen punto de comparación aquí: la API está mucho, mucho más cerca de Silverlight. Si lo mira de esa manera, hay inconsistencias entre los dos, pero la escala está más cerca del escritorio frente a WP7 Silverlight, no Silverlight frente a WPF.
Pavel Minaev
11
Gran respuesta. ¿WinRT accede al kernel NT directamente (cuando necesita soporte del sistema operativo) o pasa por Win32?
Timores
66

De la nota clave de Build :

Keynote stack

Proporcionan API comunes tanto para aplicaciones HTML / CSS / JavaScript como para aplicaciones C # / XAML. Se usarán C # y XAML, pero no será WPF o Silverlight exactamente.

RandomEngy
fuente
8
Esto es un poco más complicado, ya que el nuevo XAML está disponible tanto para C # como para C ++ (nativo). No es ni WPF ni Silverlight, pero está muy cerca de este último: como se demuestra en la nota clave, a menudo puede salirse con la simple modificación de un montón de usos y otras refactorizaciones triviales en el código Silverlight existente. Las ideas centrales detrás de WPF / Silverlight (marcado declarativo, recursos, estilos, plantillas, enlaces de datos, etc.) están ahí. La mayoría de los controles también están ahí.
Pavel Minaev
2
Hay un mejor gráfico que vi esta mañana, pero no puedo encontrarlo de nuevo. EDITAR: Encontrado, gracias a otra respuesta a esta pregunta. dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Chris Charabaruk
1
¿Dónde cabe WPF en la diapositiva?
paparazzo
1
Está agrupado con .NET / Silverlight en la parte inferior derecha.
BoltClock
1
Esa imagen es muy incorrecta, en lo que respecta a las piezas existentes. Casi puede solucionarlo reemplazando "Servicios de kernel de Windows" con "Win32 kernel32.dll" y "Win32" con "Win32 user32.dll + gdi32.dll" ... pero IE y .NET / Silverlight deberían estar en capas principalmente en la parte superior de user32.dll + gdi32.dll, y aquellos, así como C / C ++ / Java / Delphi / etc también llegan a kernel32.dll. Lo importante es que user32.dll y gdi32.dll NO subyacen a WinRT, y que las aplicaciones de la Tienda Windows no pueden llegar más allá de WinRT directamente a la potencia máxima de kernel32.dll.
Ben Voigt
37

La idea clave es que ahora hay dos pistas de desarrollo: Desktop y Metro.

  • El escritorio es donde viven las aplicaciones antiguas.
  • La nueva clase de aplicaciones, aplicaciones Metro, se puede construir de varias maneras, incluso mediante VB.NET, C # o C ++. Estas tres opciones de idioma pueden usar XAML para construir la interfaz de usuario. La alternativa es usar JavaScript / HTML5 / CSS para el desarrollo de la interfaz de usuario y el código de la aplicación.

Algunos puntos importantes:

  • Windows 8 se siente como un sistema operativo de teléfono móvil mejorado.
  • En Metro, no hay ventanas superpuestas de nivel superior, como tampoco las hay en un teléfono móvil. Si desea una aplicación de estilo MDI, debe permanecer en el escritorio.
  • Las aplicaciones de estilo Metro se suspenden automáticamente cuando no están visibles. Esto se hizo para prolongar la vida útil de la batería. Esto significa que no tendrá sentido que muchas aplicaciones de escritorio existentes, que realizan el procesamiento en segundo plano, incluso cuando el usuario no está interactuando con ellas, sean transportadas a Metro.
  • La versión ARM de Windows 8 no admitirá aplicaciones de escritorio. Entonces, si desea escribir una aplicación y quiere que funcione en cualquier versión de Windows, entonces debe ser una aplicación de Metro.
dodgy_coder
fuente
2
En Metro, no hay ventanas superpuestas de nivel superior. Todavía hay Popup( msdn.microsoft.com/en-us/library/windows/apps/… ), así que si lo desea, puede cocinar algo parecido a MDI. Obviamente no se recomienda abusar de él, ya que corre el riesgo de terminar con una interfaz de usuario no táctil.
Pavel Minaev
@Pavel, eso es interesante, ¿eso significa que puede tener un par de ventanas de nivel superior ejecutándose una al lado de la otra, pero sin superponerse? por ejemplo, en mosaico ... ¿compartiendo la mitad de la pantalla, por ejemplo? La aplicación WPF en la que estoy trabajando ahora necesita este tipo de funcionalidad.
dodgy_coder
3
Cada aplicación de Metro solo tiene una ventana de nivel superior. Puede tener dos aplicaciones de Metro ejecutándose una al lado de la otra, pero esto es algo que el usuario decide: no hay forma de que la aplicación se fuerce a esta configuración. Además, incluso si tiene dos aplicaciones que se ejecutan una al lado de la otra, no pueden comunicarse para coordinarse (excepto a través de gestos explícitos del usuario, como "Compartir en").
Pavel Minaev
1
Por otro lado, puede, por supuesto, subdividir su propia ventana de nivel superior en tantas áreas como desee y proporcionar un divisor móvil para cambiar su tamaño, que, desde la perspectiva del usuario, se vería como dos ventanas de nivel superior en mosaico . Sin embargo, seguirían apareciendo como una sola cosa en el conmutador de aplicaciones (¿pero entonces probablemente lo desearía?).
Pavel Minaev
3
Según Martyn Lovell, no hay ningún mecanismo deliberado para eso, y algunos que podrían usarse para ello están restringidos intencionalmente. Las canalizaciones con nombre no están allí, por ejemplo, ni los archivos asignados a la memoria. Hay sockets (incluidos los sockets del servidor), pero al conectarse localhost, solo puede conectarse a la misma aplicación. Puede usar archivos normales en una de las "carpetas conocidas" compartidas (Documentos, Imágenes, etc.), pero ese es un truco bastante burdo que requiere sondeo y es visible para el usuario.
Pavel Minaev
24

Hay una versión modificada de la arquitectura que seguramente lo ayudará a comprender dónde se encuentran exactamente las cosas. Uno de los ninjas de Telerik conversó con el equipo de CLR y modificó la imagen:

Plataforma y herramientas de Windows 8 (incluido el CLR)

Aquí puede ver dónde se encuentra el CLR. .NET Framework ahora tiene dos perfiles

1- Perfil de .NET Metro (CLR que se ocupa de la aplicación Metro)

2- Perfil de cliente .NET (tiempo de ejecución CLR para aplicaciones C # y VB.NET)

Espero que esto te dé una imagen más clara. Lea el artículo completo en Una mala imagen vale más que mil largas discusiones. .

vendettamit
fuente
17

Muchos detalles de Microsoft aquí .

Windows Runtime se expone mediante metadatos de API (archivos .winmd). Este es el mismo formato utilizado por el marco .NET (Ecma-335). El contrato binario subyacente facilita el acceso a las API de Windows Runtime directamente en el lenguaje de desarrollo que elija. La forma y la estructura de las API de Windows Runtime se pueden entender tanto con lenguajes estáticos como C # como con lenguajes dinámicos como JavaScript. IntelliSense está disponible en JavaScript, C #, Visual Basic y C ++.

En resumen, Windows Runtime es un nuevo conjunto de bibliotecas que expone la funcionalidad de Windows y está disponible para JavaScript / C # / VB / C ++. Se ha hecho que cada idioma los entienda y pueda llamarlos directamente en lugar de tener que pasar por una capa de thunking.

Silverlight y WPF son sabores de XAML que se ejecutan en el CLR. Entre otras funciones, Windows Runtime expone una versión de XAML muy similar a Silverlight, pero lo hace de forma nativa, no a través del CLR. Se puede acceder desde el CLR, pero también desde C ++.

Steve Rowe
fuente
2
La "capa de thunking" puede estar presente, por ejemplo, CLR realmente utiliza RCW, pero ahora es un detalle de implementación. Desde la perspectiva del desarrollador, usted hace referencia directa a los archivos WinRT .winmd, y trabaja directamente con los tipos dentro.
Pavel Minaev
3
Mientras que la capa de thunking usa RCW, los RCW para el tiempo de ejecución de Windows son más livianos que los viejos RCW de P / Invoke.
ReinstateMonica Larry Osterman