Wie vergleicht sich Windows 8 Runtime (WinRT / Windows Store-Apps / Windows 10 Universal App) mit Silverlight und WPF? [geschlossen]

353

Ich versuche, mich mit der neuen Windows 8-Laufzeit vertraut zu machen, mit der Apps im Metro- Stil erstellt werden. Ich weiß, dass Sie es mit XAML verwenden können und es auf .NET basiert, sodass C # und VB.NET zum Schreiben der Apps verwendet werden können, aber dann scheint es etwas mit HTML, CSS, DOM und JavaScript zu tun zu haben.

Kann jemand in ein paar Absätzen erklären, was ein .NET UI-Programmierer verstehen kann? (Mir fehlt ein „Schlüssel“, der notwendig ist, um ihn zu verstehen.)


Wir alle wissen, dass WPF, Silverlight , Windows Forms usw. unter Windows 8 (und Windows 10) zumindest auf Intel-Systemen weiterhin funktionieren. Sagen Sie mir also bitte nicht, dass ...

Ian Ringrose
quelle
22
Es basiert nicht auf .NET, sondern ist nur diesem ausgesetzt (ein bisschen wie COM-Interop, aber viel nahtloser ... zB keine Interop-Assemblys).
Pavel Minaev
Fragen Sie nach WinRT als Plattform (ABI, Objektmodell usw.) - in diesem Fall ist es sinnvoller, es mit COM oder .NET zu vergleichen - oder nach WinRT-Standardklassenbibliotheken, einschließlich solcher für die Benutzeroberfläche?
Pavel
1
Beachten Sie, dass Sie die zugrunde liegende Technologie, das Objektmodell usw. - ähnlich wie z. B. COM - und bestimmte Bibliotheken, die mit dieser Technologie implementiert wurden, unterscheiden sollten. Selbst im letzteren Fall sind nicht alle Standardbibliotheken UI-Bibliotheken. Wenn Sie im Objektbrowser in VS nachsehen, können Sie die Breite der Funktionen sehen, die Windows.*Namespaces abdecken. Die bisherige Terminologie ist hier etwas verwirrend, da sich WinRT sowohl auf die Technologie als auch auf den gesamten Satz von Standardbibliotheken bezieht. Ich glaube nicht, dass es nur für die UI-Bibliotheken ( Windows.UI.*) eine prägnante Bezeichnung gibt .
Pavel Minaev
@TrueWill: Es ist sinnvoller, alle drei zu lernen, damit Ihr Wissen besser abgerundet wird und Sie entscheiden können, welche Lösung für ein bestimmtes Problem am besten geeignet ist. Lerne nicht nur einen von drei.
Chris Charabaruk
2
@TrueWill: Silverlight wird keine zukünftigen Versionen haben: zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/…
Sabuncu

Antworten:

479

Auf der untersten Ebene ist WinRT ein Objektmodell, das auf ABI-Ebene definiert ist. Es verwendet COM als Basis (also implementiert IUnknownund führt jedes WinRT-Objekt eine Nachzählung durch) und erstellt von dort aus. Im Vergleich zu alten COM-Konzepten, von denen die meisten direkt aus .NET stammen, werden viele neue Konzepte hinzugefügt. Das WinRT-Objektmodell verfügt beispielsweise über Delegaten, und Ereignisse werden im .NET-Stil ausgeführt (mit Delegaten und Abonnenten hinzufügen / entfernen) Methoden, eine pro Ereignis) anstelle des alten COM-Modells für Ereignisquellen und -senken. Von anderen bemerkenswerten Dingen hat WinRT auch parametrisierte ("generische") Schnittstellen.

Eine weitere große Änderung besteht darin, dass für alle WinRT-Komponenten Metadaten verfügbar sind, genau wie für .NET-Assemblys. In COM hatten Sie das irgendwie mit Typelibs, aber nicht jede COM-Komponente hatte sie. Für WinRT sind die Metadaten in .winmd-Dateien enthalten. Sehen Sie in der Entwicklervorschau unter "C: \ Programme (x86) \ Windows Kits \ 8.0 \ Windows-Metadaten \" nach. Wenn Sie herumstöbern, werden Sie feststellen, dass es sich tatsächlich um CLI-Assemblys ohne Code handelt, sondern nur um Metadatentabellen. Sie können sie tatsächlich mit ILDASM öffnen. Beachten Sie, dass dies nicht bedeutet, dass WinRT selbst verwaltet wird - es verwendet einfach das Dateiformat.

Dann gibt es eine Reihe von Bibliotheken, die in Bezug auf dieses Objektmodell implementiert sind und WinRT-Schnittstellen und -Klassen definieren. Sehen Sie sich erneut den oben genannten Ordner "Windows-Metadaten" an, um zu sehen, was sich dort befindet. oder starten Sie einfach den Objektbrowser in VS und wählen Sie "Windows 8.0" in der Framework-Auswahl, um zu sehen, was behandelt wird. Es gibt viel, und es geht nicht nur um die Benutzeroberfläche - Sie erhalten auch Namespaces wie Windows.Data.Json, oder Windows.Graphics.Printing, oder Windows.Networking.Sockets.

Dann erhalten Sie mehrere Bibliotheken, die sich speziell mit der Benutzeroberfläche befassen - meistens handelt es sich dabei um verschiedene Namespaces unter Windows.UIoder Windows.UI.Xaml. Viele von ihnen sind den WPF / Silverlight-Namespaces sehr ähnlich - z. B. stimmen sie Windows.UI.Xaml.Controlseng überein System.Windows.Controls; das Gleiche gilt für Windows.UI.Xaml.Documentsetc.

Jetzt kann .NET WinRT-Komponenten direkt referenzieren, als wären sie .NET-Assemblys. Dies funktioniert anders als bei COM Interop - Sie benötigen keine Zwischenartefakte wie Interop-Assemblys, sondern nur /reine .winmd-Datei, und alle Typen und ihre Mitglieder in ihren Metadaten werden für Sie sichtbar, als wären sie .NET-Objekte. Beachten Sie, dass die WinRT-Bibliotheken selbst vollständig nativ sind (und daher native C ++ - Programme, die WinRT verwenden, überhaupt keine CLR benötigen) - die Magie, all das verwaltete Material verfügbar zu machen, befindet sich in der CLR selbst und ist ziemlich niedrig. Wenn Sie ein .NET-Programm verwenden, das auf eine .winmd-Datei verweist, werden Sie feststellen, dass es tatsächlich wie eine externe Assembly-Referenz aussieht - es gibt keine handlichen Tricks wie das Einbetten von Typen.

Es ist auch keine stumpfe Zuordnung - CLR versucht, WinRT-Typen nach Möglichkeit an ihre Entsprechungen anzupassen. So zB GUIDs, Termine und URIs werden System.Guid, System.DateTimeund System.Urisind; WinRT-Erfassungsschnittstellen wie IIterable<T>und IVector<T>werden IEnumerable<T>und IList<T>; und so weiter. Dies geht in beide Richtungen: Wenn Sie ein implementiertes .NET-Objekt IEnumerable<T>haben und es an WinRT zurückgeben, wird es als angezeigt IIterable<T>.

Dies bedeutet letztendlich, dass Ihre .NET Metro-Apps Zugriff auf eine Teilmenge der vorhandenen Standard-.NET-Bibliotheken sowie auf (native) WinRT-Bibliotheken erhalten, von denen einige - insbesondere Windows.UI- Silverlight in Bezug auf die API sehr ähnlich sehen. Sie haben immer noch XAML, um Ihre Benutzeroberfläche zu definieren, und Sie beschäftigen sich immer noch mit denselben Grundkonzepten wie in Silverlight - Datenbindungen, Ressourcen, Stile, Vorlagen usw. In vielen Fällen ist es möglich, eine Silverlight-App einfach über usingdie neuen Namespaces zu portieren. und Optimieren einiger Stellen im Code, an denen die API angepasst wurde.

WinRT selbst hat nichts mit HTML und CSS zu tun und hat nur in dem Sinne eine Beziehung zu JavaScript, dass es auch dort verfügbar gemacht wird, ähnlich wie es für .NET gemacht wird. Sie müssen sich nicht mit HTML / CSS / JS befassen, wenn Sie WinRT-UI-Bibliotheken in Ihrer .NET Metro-App verwenden (ich denke, wenn Sie wirklich wollen, können Sie ein WebViewSteuerelement hosten ...). Alle Ihre .NET- und Silverlight-Kenntnisse bleiben in diesem Programmiermodell sehr relevant.

Pavel Minaev
quelle
Was ist mit der WPF-WinRT-Kompatibilität? Wird es WPF-Silverlight-Inkonsistenzen geben?
Den
5
@Den WPF ist hier kein guter Vergleichspunkt - die API ist Silverlight viel, viel näher. Wenn Sie es so betrachten, gibt es Inkonsistenzen zwischen den beiden, aber die Skalierung ist näher an Desktop gegenüber WP7 Silverlight, nicht an Silverlight gegenüber WPF.
Pavel Minaev
11
Gute Antwort. Greift WinRT direkt auf den NT-Kernel zu (wenn es Betriebssystemunterstützung benötigt) oder geht es über Win32?
Timores
66

Aus der Build- Keynote:

Keynote-Stack

Sie bieten gemeinsame APIs sowohl für HTML / CSS / JavaScript-Apps als auch für C # / XAML-Apps. C # und XAML werden verwendet, aber es wird nicht genau WPF oder Silverlight sein.

RandomEngy
quelle
8
Dies ist etwas komplizierter, da das neue XAML-Ding sowohl für C # als auch für (natives) C ++ verfügbar ist. Es ist weder WPF noch Silverlight, aber sehr nahe an letzterem - wie in der Keynote gezeigt, können Sie oft davonkommen, nur eine Reihe von Verwendungen und andere solche trivialen Refactorings in vorhandenem Silverlight-Code zu ändern. Die Kernideen von WPF / Silverlight - deklaratives Markup, Ressourcen, Stile, Vorlagen, Datenbindungen usw. - sind alle vorhanden. Die meisten Steuerelemente sind auch vorhanden.
Pavel Minaev
2
Es gibt eine bessere Grafik, die ich heute Morgen gesehen habe, aber ich kann sie einfach nicht wiederfinden. EDIT: Gefunden, dank einer anderen Antwort auf diese Frage. dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Chris Charabaruk
1
Wo passt WPF auf die Folie?
Paparazzo
1
Es ist unten rechts mit .NET / Silverlight gruppiert.
BoltClock
1
Dieses Bild ist in Bezug auf die vorhandenen Stücke grob falsch. Sie können das Problem fast beheben, indem Sie "Windows Kernel Services" durch "Win32 kernel32.dll" und "Win32" durch "Win32 user32.dll + gdi32.dll" ersetzen. IE und .NET / Silverlight sollten jedoch größtenteils übereinander liegen von user32.dll + gdi32.dll und diese sowie C / C ++ / Java / Delphi / etc reichen auch bis zu kernel32.dll. Wichtig ist, dass user32.dll und gdi32.dll NICHT WinRT zugrunde liegen und dass Windows Store Apps nicht direkt über WinRT hinaus die volle Leistung von kernel32.dll erreichen können.
Ben Voigt
37

Die Schlüsselidee ist, dass es jetzt zwei Entwicklungspfade gibt - den Desktop und den Metro.

  • Auf dem Desktop leben die alten Apps.
  • Die neue Klasse von Anwendungen, Metro-Anwendungen, kann auf verschiedene Arten erstellt werden, unter anderem durch VB.NET, C # oder C ++. Diese drei Sprachoptionen können XAML zum Erstellen der Benutzeroberfläche verwenden. Die Alternative besteht darin, JavaScript / HTML5 / CSS für die Entwicklung der Benutzeroberfläche und des Anwendungscodes zu verwenden.

Einige wichtige Punkte:

  • Windows 8 fühlt sich wie ein hochskaliertes Betriebssystem für Mobiltelefone an.
  • In Metro gibt es keine überlappenden Fenster der obersten Ebene, so wie es keine auf einem Mobiltelefon gibt. Wenn Sie eine Anwendung im MDI-Stil wünschen, müssen Sie auf dem Desktop bleiben.
  • Apps im Metro-Stil werden automatisch angehalten, wenn sie nicht sichtbar sind. Dies wurde durchgeführt, um die Batterielebensdauer zu verlängern. Dies bedeutet, dass es nicht sinnvoll ist, viele vorhandene Desktop-Apps, die eine Hintergrundverarbeitung durchführen, auch wenn der Benutzer nicht mit ihnen interagiert, auf Metro zu portieren.
  • Die ARM-Version von Windows 8 unterstützt keine Desktopanwendungen. Wenn Sie also eine App schreiben möchten und möchten, dass sie unter einer beliebigen Windows-Version funktioniert, muss es sich um eine Metro-App handeln.
dodgy_coder
quelle
2
In Metro gibt es keine überlappenden Fenster der obersten Ebene . Es gibt noch Popup( msdn.microsoft.com/en-us/library/windows/apps/… ). Wenn Sie möchten, können Sie also etwas MDI-ähnliches erfinden . Es wird offensichtlich nicht empfohlen, es zu missbrauchen, da Sie Gefahr laufen, eine nicht berührungsfreundliche Benutzeroberfläche zu erhalten.
Pavel Minaev
@Pavel - das ist interessant - bedeutet das, dass ein paar Fenster der obersten Ebene nebeneinander laufen können, sich aber nicht überlappen? zB gekachelt ... zum Beispiel jeweils die Hälfte des Bildschirms teilen? Die WPF-App, an der ich gerade arbeite, benötigt diese Art von Funktionalität.
dodgy_coder
3
Jede Metro-App verfügt nur über ein Fenster der obersten Ebene. Sie können zwei Metro-Apps nebeneinander ausführen lassen, aber dies entscheidet der Benutzer - es gibt keine Möglichkeit für die App, sich in diese Konfiguration zu zwingen. Selbst wenn zwei Apps nebeneinander ausgeführt werden, können sie nicht miteinander koordinieren (außer durch explizite Benutzergesten wie "Teilen für").
Pavel Minaev
1
Auf der anderen Seite können Sie Ihr eigenes Fenster der obersten Ebene natürlich in beliebig viele Bereiche unterteilen und einen beweglichen Teiler bereitstellen, um deren Größe zu ändern - was aus Anwendersicht wie zwei gekachelte Fenster der obersten Ebene aussehen würde . Sie würden jedoch immer noch als eine einzige Sache im App-Umschalter angezeigt (aber dann möchten Sie es wahrscheinlich?).
Pavel Minaev
3
Laut Martyn Lovell gibt es dafür keinen absichtlichen Mechanismus, und einige, die dafür verwendet werden könnten, sind absichtlich eingeschränkt. Named Pipes sind beispielsweise nicht vorhanden, und es gibt auch keine Speicherzuordnungsdateien. Es gibt Sockets (einschließlich Server-Sockets), aber wenn Sie eine Verbindung herstellen, localhostkönnen Sie nur eine Verbindung zu derselben App herstellen. Sie könnten normale Dateien in einem der freigegebenen "bekannten Ordner" (Dokumente, Bilder usw.) verwenden, aber das ist ein ziemlich grober Hack, der eine Abfrage erfordert und für den Benutzer sichtbar ist.
Pavel Minaev
24

Es gibt eine modifizierte Version der Architektur, die Ihnen sicherlich hilft zu verstehen, wo genau die Dinge liegen. Einer der Telerik-Ninjas unterhielt sich mit dem CLR- Team und änderte das Bild:

Windows 8-Plattform und -Tools (einschließlich CLR)

Hier können Sie sehen, wo die CLR steht. Das .NET Framework verfügt jetzt über zwei Profile

1- .NET Metro-Profil (CLR, die sich mit Metro-Anwendungen befasst)

2- .NET-Client-Profil (CLR-Laufzeit für C # - und VB.NET-Anwendungen)

Ich hoffe, das gibt Ihnen ein klareres Bild. Lesen Sie den vollständigen Artikel in Ein schlechtes Bild ist tausend lange Diskussionen wert. .

vendettamit
quelle
17

Viele Details von Microsoft hier .

Die Windows-Laufzeit wird mithilfe von API-Metadaten (.winmd-Dateien) verfügbar gemacht. Dies ist das gleiche Format, das vom .NET Framework (Ecma-335) verwendet wird. Der zugrunde liegende Binärvertrag erleichtert Ihnen den Zugriff auf die Windows Runtime-APIs direkt in der Entwicklungssprache Ihrer Wahl. Die Form und Struktur der Windows Runtime-APIs kann sowohl von statischen Sprachen wie C # als auch von dynamischen Sprachen wie JavaScript verstanden werden. IntelliSense ist in JavaScript, C #, Visual Basic und C ++ verfügbar.

Kurz gesagt, Windows Runtime ist eine neue Reihe von Bibliotheken, die Windows-Funktionen verfügbar machen und für JavaScript / C # / VB / C ++ verfügbar sind. Jede Sprache wurde dazu gebracht, sie zu verstehen und direkt anrufen zu können, anstatt eine dicke Schicht durchlaufen zu müssen.

Silverlight und WPF sind XAML-Varianten, die auf der CLR ausgeführt werden. Windows Runtime stellt unter anderem eine Version von XAML zur Verfügung, die Silverlight sehr ähnlich ist, dies jedoch auf native Weise und nicht über die CLR. Der Zugriff erfolgt über die CLR, aber auch über C ++.

Steve Rowe
quelle
2
Die "Thunking-Schicht" kann vorhanden sein - z. B. verwendet CLR tatsächlich RCWs -, ist jedoch jetzt ein Implementierungsdetail. Aus dev-Sicht verweisen Sie direkt auf WinRT .winmd-Dateien und arbeiten direkt mit den darin enthaltenen Typen.
Pavel Minaev
3
Während die Thunking-Schicht RCWs verwendet, sind die RCWs für die Windows-Laufzeit leichter als die alten P / Invoke-RCWs.
ReinstateMonica Larry Osterman