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 IUnknown
y 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.UI
o Windows.UI.Xaml
. Muchos de ellos son muy similares a los espacios de nombres de WPF / Silverlight, por ejemplo, Windows.UI.Xaml.Controls
coinciden estrechamente System.Windows.Controls
; lo mismo para Windows.UI.Xaml.Documents
etc.
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 /r
un 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.DateTime
y 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 using
los 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 WebView
control ...). Todas sus habilidades de .NET y Silverlight siguen siendo muy relevantes en este modelo de programación.