Come si confronta Windows 8 Runtime (app WinRT / Windows Store / Windows 10 Universal) con Silverlight e WPF? [chiuso]


353

Sto cercando di capire come funziona il nuovo Windows 8 Runtime utilizzato per creare app in stile Metro . So che puoi usarlo con XAML ed è basato su .NET, quindi C # e VB.NET possono essere usati per scrivere le app, ma sembra avere qualcosa a che fare con HTML, CSS, DOM e JavaScript.

Qualcuno può spiegare di cosa si tratta in pochi paragrafi, in termini che un programmatore dell'interfaccia utente .NET può capire? (Mi manca qualcosa di "chiave" che è necessario per capirlo.)


Sappiamo tutti che WPF, Silverlight , Windows Form , ecc. Continueranno a funzionare su Windows 8 (e Windows 10) almeno su sistemi Intel, quindi per favore non dirmi che ...


22
Non è basato su .NET, esposto solo ad esso (un po 'come l'interoperabilità COM, ma molto più semplice ... ad es. Nessun assembly di interoperabilità).
Pavel Minaev,

Stai chiedendo WinRT come piattaforma (ABI, modello a oggetti, ecc.) - nel qual caso ha più senso confrontarlo con COM o .NET - o su librerie di classi standard WinRT, comprese quelle per l'interfaccia utente?
Pavel Minaev,

1
Si noti che è necessario distinguere la tecnologia sottostante, il modello a oggetti, ecc., Simile ad esempio a COM, e le librerie specifiche implementate utilizzando tale tecnologia. Anche nel caso di quest'ultimo, non tutte le librerie standard sono librerie UI - se si guarda nel browser degli oggetti in VS, è possibile vedere l'ampiezza delle funzionalità Windows.*coperte dagli spazi dei nomi. Fin qui la terminologia è alquanto confusa, in quanto WinRT si riferisce sia alla tecnologia sia all'intero set di librerie standard. Non penso che ci sia alcuna etichetta concisa solo per le librerie UI ( Windows.UI.*) però.
Pavel Minaev,

@TrueWill: ha più senso imparare tutti e tre, in modo che le tue conoscenze siano più complete e che tu possa decidere quale soluzione è la migliore per un determinato problema. Non solo imparare uno dei tre.
Chris Charabaruk,

2
@TrueWill: Silverlight non avrà versioni future: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/…
Sabuncu,

Risposte:


479

Al livello più basso, WinRT è un modello a oggetti definito a livello ABI. Usa COM come base (quindi ogni oggetto WinRT implementa IUnknowne ricontatta) e costruisce da lì. Aggiunge molti nuovi concetti rispetto a COM di vecchi, la maggior parte dei quali provengono direttamente da .NET - ad esempio, il modello a oggetti WinRT ha delegati e gli eventi sono fatti in stile .NET (con delegati e aggiungi / rimuovi abbonato metodi, uno per evento) anziché il vecchio modello COM di origini e sink di eventi. Tra le altre cose degne di nota, WinRT ha anche interfacce parametrizzate ("generiche").

Un altro grande cambiamento è che tutti i componenti WinRT hanno metadati disponibili per loro, proprio come gli assembly .NET. In COM è una specie di quello con typelibs, ma non tutti i componenti COM li avevano. Per WinRT, i metadati sono contenuti nei file .winmd - guarda dentro "C: \ Programmi (x86) \ Windows Kits \ 8.0 \ Windows Metadata \" in Anteprima sviluppatore. Se cerchi, vedrai che in realtà sono assiemi CLI senza codice, solo tabelle di metadati. Puoi aprirli con ILDASM, in effetti. Nota, questo non significa che WinRT stesso sia gestito, ma semplicemente riutilizza il formato del file.

Quindi ci sono un certo numero di librerie implementate in termini di quel modello di oggetti - che definiscono le interfacce e le classi WinRT. Ancora una volta, guarda la cartella "Windows Metadata" di cui sopra per vedere cosa c'è lì; o semplicemente avvia Object Browser in VS e seleziona "Windows 8.0" nel selettore di framework, per vedere cosa è coperto. C'è molto lì e non si occupa solo dell'interfaccia utente: ottieni anche spazi dei nomi come Windows.Data.Json, o Windows.Graphics.Printing, o Windows.Networking.Sockets.

Quindi ottieni diverse librerie, che si occupano in particolare dell'interfaccia utente - per lo più si tratta di vari spazi dei nomi sotto Windows.UIo Windows.UI.Xaml. Molti di loro sono molto simili agli spazi dei nomi WPF / Silverlight - ad esempio, Windows.UI.Xaml.Controlssono strettamente corrispondenti System.Windows.Controls; idem per Windows.UI.Xaml.Documentsecc.

Ora .NET ha la possibilità di fare riferimento direttamente ai componenti WinRT come se fossero assembly .NET. Funziona diversamente dall'interoperabilità COM: non sono necessari artefatti intermedi come gli assembly di interoperabilità, è solo /run file .winmd e tutti i tipi e i relativi membri nei suoi metadati diventano visibili a te come se fossero oggetti .NET. Si noti che le stesse librerie WinRT sono completamente native (e quindi i programmi C ++ nativi che utilizzano WinRT non richiedono affatto CLR) - la magia per esporre tutta quella roba come gestita è all'interno del CLR stesso, ed è di livello abbastanza basso. Se ildasm un programma .NET che fa riferimento a un .winmd, vedrai che in realtà sembra un riferimento ad un assieme esterno - non ci sono giochi di prestigio come il tipo di inserimento lì.

Non è nemmeno una mappatura smussata: CLR tenta di adattare i tipi di WinRT ai loro equivalenti, ove possibile. Ad esempio, GUID, date e URI diventano System.Guid, System.DateTimee System.Uri, rispettivamente; Interfacce di raccolta WinRT come IIterable<T>e IVector<T>diventano IEnumerable<T>e IList<T>; e così via. Questo funziona in entrambi i modi: se si dispone di un oggetto .NET che lo implementa IEnumerable<T>e lo restituisce a WinRT, lo vedrà come IIterable<T>.

In definitiva, ciò significa che le tue app .NET Metro hanno accesso a un sottoinsieme delle librerie .NET standard esistenti e anche alle librerie (native) WinRT, alcune delle quali - in particolare Windows.UI- sembrano molto simili a Silverlight, per quanto riguarda le API. Hai ancora XAML per definire la tua interfaccia utente e gestisci ancora gli stessi concetti di base di Silverlight: associazioni di dati, risorse, stili, modelli ecc. In molti casi, è possibile eseguire il porting di un'app Silverlight semplicemente con usingi nuovi spazi dei nomi, e modificando alcuni punti del codice in cui l'API è stata modificata.

WinRT stesso non ha nulla a che fare con HTML e CSS, e ha relazione con JavaScript solo nel senso che è anche esposto lì, in modo simile a come viene fatto per .NET. Non è necessario occuparsi di HTML / CSS / JS quando si utilizzano le librerie dell'interfaccia utente WinRT nella propria app .NET Metro (beh, immagino, se proprio lo si desidera, è possibile ospitare un WebViewcontrollo ...). Tutte le tue competenze .NET e Silverlight rimangono molto rilevanti in questo modello di programmazione.


Che dire della compatibilità WPF-WinRT? Ci saranno incoerenze tra WPF e Silverlight?
Den,

5
@Den WPF non è un buon punto di riferimento qui: l'API è molto, molto più vicina a Silverlight. Se lo guardi in questo modo, ci sono incoerenze tra i due, ma la scala è più vicina al desktop rispetto a WP7 Silverlight, non a Silverlight vs WPF.
Pavel Minaev,

11
Bella risposta. WinRT accede direttamente al kernel NT (quando necessita del supporto del sistema operativo) o passa attraverso Win32?
Timores,


66

Dal keynote di Build :

Stack di note chiave

Stanno fornendo API comuni sia alle app HTML / CSS / JavaScript che alle app C # / XAML. Verranno utilizzati C # e XAML, ma non saranno esattamente WPF o Silverlight.


8
Questo è un po 'più complicato, dato che il nuovo oggetto XAML è disponibile sia per C # che per C ++ (nativo). Non è né WPF né Silverlight, ma molto vicino a quest'ultimo - come dimostrato nel keynote, puoi spesso cavartela semplicemente cambiando un mucchio di usi e altre banali rifattorizzazioni nel codice Silverlight esistente. Le idee alla base di WPF / Silverlight - markup dichiarativo, risorse, stili, modelli, connessioni dati ecc. - sono tutte presenti. La maggior parte dei controlli ci sono anche.
Pavel Minaev,

2
C'è un grafico migliore là fuori che ho visto stamattina, ma non riesco a trovarlo di nuovo. EDIT: Trovato, grazie a un'altra risposta su questa domanda. dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Chris Charabaruk,

1
Dove si inserisce WPF sulla diapositiva?
paparazzo,

1
È raggruppato insieme a .NET / Silverlight in basso a destra.
BoltClock

1
Quell'immagine è gravemente errata, per quanto riguarda i pezzi esistenti. Puoi quasi risolverlo sostituendo "Servizi kernel di Windows" con "Win32 kernel32.dll" e "Win32" con "Win32 user32.dll + gdi32.dll" ... ma IE e .NET / Silverlight dovrebbero essere sovrapposti principalmente in cima di user32.dll + gdi32.dll e quelli oltre a C / C ++ / Java / Delphi / etc raggiungono anche kernel32.dll. La cosa importante è che user32.dll e gdi32.dll NON sono alla base di WinRT e che le app di Windows Store non riescono a raggiungere WinRT oltre la piena potenza di kernel32.dll.
Ben Voigt,

37

L'idea chiave è che ora ci sono due tracce di sviluppo: Desktop e Metro.

  • Il desktop è dove vivono le vecchie app.
  • La nuova classe di applicazioni, le applicazioni Metro, può essere costruita in diversi modi, tra cui VB.NET, C # o C ++. Queste tre opzioni di lingua possono utilizzare XAML per creare l'interfaccia utente. L'alternativa è utilizzare JavaScript / HTML5 / CSS per lo sviluppo dell'interfaccia utente e del codice dell'applicazione.

Alcuni punti importanti:

  • Windows 8 sembra un sistema operativo per telefoni cellulari evoluto.
  • In Metro, non ci sono finestre di livello superiore sovrapposte, proprio come non ce ne sono su un telefono cellulare. Se si desidera un'applicazione in stile MDI, è necessario rimanere sul desktop.
  • Le app in stile Metro vengono automaticamente sospese quando non sono visibili. Questo è stato fatto per prolungare la durata della batteria. Ciò significa che non ha senso per molte app desktop esistenti, che eseguono l'elaborazione in background anche quando l'utente non interagisce con esse, per essere trasferite su Metro.
  • La versione ARM di Windows 8 non supporterà le applicazioni desktop. Quindi, se vuoi scrivere un'app e vuoi che funzioni su qualsiasi versione di Windows, allora deve essere un'app Metro.

2
In Metro, non ci sono finestre di livello superiore sovrapposte . C'è ancora Popup( msdn.microsoft.com/en-us/library/windows/apps/… ), quindi se vuoi, puoi cucinare qualcosa di simile a MDI. Ovviamente non è consigliabile abusarne poiché rischi di finire con un'interfaccia utente non touch-friendly.
Pavel Minaev,

@Pavel - è interessante - significa che puoi avere un paio di finestre di livello superiore che corrono fianco a fianco, ma non si sovrappongono? ad esempio piastrellato ... condividendo metà dello schermo ciascuno per esempio? L'app WPF su cui sto lavorando ora ha bisogno di questo tipo di funzionalità.
dodgy_coder

3
Ogni app Metro ha solo una finestra di livello superiore. Puoi avere due app Metro in esecuzione fianco a fianco, ma questo è qualcosa che l'utente decide: non c'è modo per l'app di imporsi in questa configurazione. Inoltre, anche se hai due app in esecuzione fianco a fianco, non possono comunicare per coordinare (tranne attraverso gesti espliciti dell'utente come "Condividi con").
Pavel Minaev,

1
D'altra parte, puoi, naturalmente, suddividere la tua finestra di livello superiore in tutte le aree che vuoi e fornire un divisore mobile per ridimensionarle - che, dal punto di vista dell'utente, sembrerebbe come due finestre piastrellate di livello superiore . Tuttavia, verrebbero comunque visualizzati come una sola cosa nel selettore di app (ma probabilmente lo vorresti?).
Pavel Minaev,

3
Secondo Martyn Lovell, non esiste alcun meccanismo deliberato per questo, e alcuni che potrebbero essere utilizzati per questo sono intenzionalmente limitati. Le pipe nominate non sono presenti, ad esempio, né i file mappati in memoria. Esistono socket (inclusi i socket del server), ma quando ci si connette a localhost, è possibile connettersi solo alla stessa app. È possibile utilizzare file normali in una delle "cartelle conosciute" condivise (Documenti, Immagini, ecc.), Ma si tratta di un hack piuttosto rozzo che richiede il polling ed è visibile all'utente.
Pavel Minaev,

24

C'è una versione modificata dell'architettura che ti aiuterà sicuramente a capire esattamente dove si trovano le cose. Uno dei ninja di Telerik ha chattato con il team CLR e ha modificato l'immagine:

Piattaforma e strumenti di Windows 8 (incluso CLR)

Qui puoi vedere dove si trova il CLR. Il framework .NET ora ha due profili

1- Profilo Metro .NET (CLR che si occupa dell'applicazione Metro)

2- Profilo client .NET (runtime CLR per applicazioni C # e VB.NET)

Spero che questo ti dia un'immagine più chiara. Leggi l'articolo completo in Una brutta foto vale mille discussioni lunghe. .


17

Molti dettagli da Microsoft qui .

Windows Runtime è esposto mediante metadati API (file .winmd). Questo è lo stesso formato utilizzato dal framework .NET (Ecma-335). Il contratto binario sottostante semplifica l'accesso alle API di Windows Runtime direttamente nella lingua di sviluppo desiderata. La forma e la struttura delle API di Windows Runtime possono essere comprese sia da linguaggi statici come C # sia da linguaggi dinamici come JavaScript. IntelliSense è disponibile in JavaScript, C #, Visual Basic e C ++.

In breve, Windows Runtime è un nuovo set di librerie che espone le funzionalità di Windows e disponibile per JavaScript / C # / VB / C ++. Ogni lingua è stata fatta per capire ed essere in grado di chiamarli direttamente piuttosto che dover passare attraverso un certo livello di thunking.

Silverlight e WPF sono versioni di XAML eseguite sul CLR. Tra le altre funzionalità, Windows Runtime espone una versione di XAML molto simile a Silverlight, ma lo fa in modo nativo, non tramite CLR. È possibile accedervi dal CLR, ma anche dal C ++.


2
Il "livello di thunking" potrebbe essere presente, ad esempio CLR utilizza effettivamente RCW, ma ora è un dettaglio di implementazione. Dal punto di vista degli sviluppatori, fai direttamente riferimento ai file .winmd di WinRT e lavori direttamente con i tipi all'interno.
Pavel Minaev,

3
Mentre il layer thunking utilizza RCW, gli RCW per il runtime di Windows sono più leggeri dei vecchi RCW P / Invoke.
Ripristina Monica Larry Osterman il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.