No nível mais baixo, o WinRT é um modelo de objeto definido no nível ABI. Ele usa o COM como base (para que todo objeto WinRT implemente IUnknown
e refcounting) e crie a partir daí. Ele adiciona muitos conceitos novos em comparação com o COM antigo, a maioria dos quais vem diretamente do .NET - por exemplo, o modelo de objeto do WinRT possui delegados e os eventos são feitos no estilo .NET (com delegados e adicionar / remover assinante) métodos, um por evento) em vez do antigo modelo COM de fontes e coletores de eventos. Entre outras coisas notáveis, o WinRT também possui interfaces parametrizadas ("genéricas").
Outra grande mudança é que todos os componentes do WinRT têm metadados disponíveis para eles, assim como os assemblies do .NET. No COM, você meio que teve isso com typelibs, mas nem todos os componentes do COM os tinham. Para o WinRT, os metadados estão contidos nos arquivos .winmd - consulte "C: \ Arquivos de programas (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" na Visualização do desenvolvedor. Se você bisbilhotar, verá que eles são realmente conjuntos de CLI sem código, apenas tabelas de metadados. Você pode abri-los com o ILDASM, de fato. Observe que isso não significa que o próprio WinRT seja gerenciado - ele simplesmente reutiliza o formato do arquivo.
Existem diversas bibliotecas implementadas em termos desse modelo de objeto - definindo interfaces e classes do WinRT. Mais uma vez, veja a pasta "Metadados do Windows" mencionada acima para ver o que há; ou simplesmente inicie o Pesquisador de objetos no VS e selecione "Windows 8.0" no seletor de estrutura, para ver o que é coberto. Há muita coisa lá, e ela não lida apenas com a interface do usuário - você também recebe namespaces como Windows.Data.Json
, ou Windows.Graphics.Printing
, ou Windows.Networking.Sockets
.
Em seguida, você obtém várias bibliotecas, que estão lidando especificamente com a interface do usuário - a maioria seria vários namespaces sob Windows.UI
ou Windows.UI.Xaml
. Muitos deles são muito semelhantes aos namespaces WPF / Silverlight - por exemplo, Windows.UI.Xaml.Controls
são muito semelhantes System.Windows.Controls
; idem para Windows.UI.Xaml.Documents
etc.
Agora, o .NET tem a capacidade de referenciar diretamente os componentes do WinRT como se fossem assemblies do .NET. Isso funciona de maneira diferente da COM Interop - você não precisa de artefatos intermediários, como assemblies de interoperabilidade, apenas /r
um arquivo .winmd e todos os tipos e seus membros em seus metadados ficam visíveis para você como se fossem objetos .NET. Observe que as próprias bibliotecas do WinRT são totalmente nativas (e, portanto, os programas C ++ nativos que usam o WinRT não exigem CLR) - a mágica de expor tudo o que é gerenciado é dentro do próprio CLR e é de nível bastante baixo. Se você criar um programa .NET que referencie um .winmd, verá que ele realmente se parece com uma referência externa de montagem - não há truques fáceis como o tipo incorporação nele.
Também não é um mapeamento contundente - o CLR tenta adaptar os tipos WinRT aos seus equivalentes, sempre que possível. Assim, por exemplo, GUIDs, datas e URIs tornar-se System.Guid
, System.DateTime
e System.Uri
, respectivamente; Interfaces de coleta do WinRT como IIterable<T>
e IVector<T>
torne IEnumerable<T>
- se e IList<T>
; e assim por diante. Isso acontece nos dois sentidos - se você tem um objeto .NET que implementa IEnumerable<T>
e o repassa ao WinRT, ele será visto como IIterable<T>
.
Por fim, o que isso significa é que seus aplicativos .NET Metro obtêm acesso a um subconjunto das bibliotecas .NET padrão existentes e também às bibliotecas WinRT (nativas), algumas das quais - particularmente Windows.UI
- se parecem muito com o Silverlight, em termos de API. Você ainda tem XAML para definir sua interface do usuário e ainda lida com os mesmos conceitos básicos do Silverlight - ligações de dados, recursos, estilos, modelos etc. Em muitos casos, é possível portar um aplicativo Silverlight simplesmente pelos using
novos namespaces, e ajustando alguns lugares no código em que a API foi ajustada.
O próprio WinRT não tem nada a ver com HTML e CSS, e só se relaciona com o JavaScript no sentido de que ele também é exposto ali, semelhante à maneira como é feito para o .NET. Você não precisa lidar com HTML / CSS / JS ao usar as bibliotecas de interface do usuário do WinRT no seu aplicativo .NET Metro (bem, acho que, se você realmente quiser, pode hospedar um WebView
controle ...). Todas as suas habilidades em .NET e Silverlight permanecem muito relevantes neste modelo de programação.