Uno Platform 3.9

Das Konzept der quelloffenen Uno Platform besteht hauptsächlich darin, dem gemeinen Entwickler die neuen WinUI 3 Schnittstellen auf allen Plattformen, also auf Windows (Desktop, Xbox, Tablet), im Web-Browser oder auf dem Smartphone zur Verfügung zu stellen. Es ist jeweils egal, ob es sich um ein Windows, Linux, Mac, bzw. einem Android- oder iOS-Gerät handelt.

bilder/Uno-Platform.jpg Der erste Blick auf die Uno Platform

Die Idee einer plattformunabhängigen .NET Bibliothek, welche zur effizienten Anwendungsentwicklung auf eine wiederverwendbare und getrennte Codebasis setzt, erinnert zunächst stark an Xamarin. Die Entwicklung der Grundlagen für das Framework begann jedoch bereits vor der Umsetzung von Xamarin, als das Uno-Team zuerst Erfahrungen bei der Entwicklung eines Navigation-Frameworks für Silverlight und Windows Mobile sammelte.

Es dauerte auch nicht lange bis die Entwickler eine modifizierte Version von Silverlight auf Android und iOS zum Laufen brachten, woraufhin bereits damals hohe Ambitionen entwickelt wurden. Microsoft begann auf dieser Basis und stets mit sämtlichen Bildschirmgrößen im Hinterkopf die WinUI Schnittstellen zu entwickeln, um das Chaos, das sich über die Jahre angesammelte hat zu entwirren. Das Rad sollte hierbei nicht neu erfunden werden, vielmehr sollten die bestehenden APIs auf die verschiedenen Plattformen portiert werden. Hierfür wird Project Reunion (0.5.5) von Microsoft als Basis verwendet. 

Die Architektur der Uno Platform 3.0

Uno Platform Poster [Quelle]

Viele Konzepte, die bereits in WPF, Xamarin und anderen Plattformen etabliert wurden sind auch bei Uno wiederzufinden und man greift auf das gesammelte Wissen zurück, das Microsoft über die Dekaden in Bereichen wie responsive Design, Sicherheit oder Barrierefreiheit gesammelt hat. Das Team geht auf die Wünsche der Community ein und versucht die erprobten Werkzeuge und Entwicklungshilfen zu portieren. Allen voran die Extensible Application Markup Language (kurz: XAML), die in unserem agilen Scrum Team zum kleinen Einmaleins gehört. Features wie AttachedProperties oder DataBinding ermöglichen auch bei der Uno Platform eine lose Kopplung von Model, View und Presentation und die Entwicklung von Programmcode im eleganten MVVM Stil. Die Solution-Struktur sieht “One Project per Platform” vor, sodass die komplette Business Logik in einem Project landet, was letzten Endes von allen anderen Projekten referenziert wird. Der Live Visual Tree, Edit and Continue und Hot Reload gehören wieder zum altbekannten Repertoire zur Steigerung der Produktivität. Eine weitere von Microsoft koordinierte Kooperation des Teams der Uno Platform die uns besonders freut ist die altbekannte Prism Library, die als All-Around Werkzeug um einiges umfangreicher ist als die kleinen Toolkit-Brüder MVVM Light und Simple MVVM und vor allem bei modularen und großen Projekten eine lohnenswerte Investition darstellt, da dessen modularen Konzepte und die Entkopplung der Komponenten zu einer maximalen Wartbarkeit und Testbarkeit führen.

Unterschiede

Wer von bestehenden Frameworks auf Uno wechseln möchte, wird auf ein paar geringfügige Unterschiede treffen. So muss man sich zum Beispiel von der Property Inheritence im Visual Tree, die man in WPF gewohnt war, verabschieden.

Multi Bindings sucht man ebenso vergeblich. Hierfür hat Microsoft jedoch die - im Vergleich sogar performantere und speicherschonendere - {x:Bind} Markup Extension mit ähnlichem Funktionsumfang und einigen Verbesserungen geschaffen, womit man sogar Methoden direkt aus dem XAML aufrufen kann: <DataGrid ItemsSource="{x:Bind local:CustomerBusinessService.GetCustomers()}" />

Neben den WinUI-spezifischen Unterschieden ist man auch auf bei einzelnen Plattformen an diverse (altbekannte) Restriktionen gebunden. Hat man im Desktop alle Features zur Verfügung, so muss man zum Beispiel seine TCP-Verbindungen in der WebAssembly Runtime bei Bedarf auf einer anderen Kommunikationsschicht mit WebSockets oder HTTP substituieren und für Datenbankzugriffe beispielsweise einen dedizierten Dienst zwischenschalten. In der neusten Version wurde durch ein intelligentes Trimming die Größe der WebAssembly Apps sogar um über 50% reduziert.

Hot Reload

Eine spezielle Effizienzsteigerung, auf die ich mich besonders freue, ist der Hot Reload von Änderungen am Quellcode während der Programmlaufzeit, was langfristig betrachtet unzählige Buildzyklen ersparen wird. Nachdem .NET Core im Jahr 2014 eingeführt wurde lässt dieses Feature - egal ob XAML Hot Reload (WPF, UWP, Xamarin.Forms) oder Blazor Hot Reload - leider zu wünschen übrig, weshalb es mich umso mehr begeistert hat zu sehen, dass in den bisherigen Demonstrationen und Live-Coding Sessions selbst besonders heiklen Anpassungen am XAML auf jeder Plattform in kürzester Zeit die Änderungen sichtbar wurden. Die Devs haben es sogar geschafft, dank Catalyst, Hot Reload auch für iOS und Mac zum Laufen zu kriegen. Laut der .NET 6 Roadmap lässt ein globaler C# Hot Reload wohl auch nicht mehr lange auf sich warten, womit nicht mehr nur Änderungen an der Oberfläche sofortige Wirkung zeigen, was meiner Meinung nach ein besonderer Meilenstein in der Anwendungsentwicklung wird.

Rendering

Dank der Skia Graphics Library die auch in der Chromium Browser-Engine auf all erdenklichen Geräten Webseiten rendert, wird das XAML in pixelgenaue Oberflächen ohne plattformspezifische Beschränkungen umgewandelt. Genauer gesagt kommt die SkiaSharp Bibliothek als Alternative zum Xamarin.Android und Xamarin.iOS (die bald in .NET 5, .NET 6 und .NET 6 Mobile integriert werden) für mobile Endgeräte und SkiaSharp.Extended als Brücke zur WebAssembly Runtime im Browser ins Spiel. So kann man sogar das (noch ursprünglich aus Silverlight stammende) DataGrid-Control voll-funktional im Browser verwenden. Für das Rendering auf Linux wird Skia in Verbindung mit Gtk3 verwendet, ansonsten wird auf die jeweils nativen 2D-Grafikelemente zugegriffen.

Der Live Visual Tree wird in der WebAssembly Runtime - ähnlich wie in Blazor - komplett mit HTML DOM-Elementen repräsentiert und synchronisiert. Auf mobilen Plattformen werden hierfür ebenfalls native Elemente genutzt.

Uno ermöglicht über Styles - die über eine StaticResource zur Verfügung stehen - bei Bedarf plattformspezifischer Oberflächenelemente anzuzeigen. Ändert man also den <Slider /> einfach in <Slider Style="{StaticResource NativeDefaultSlider}" />, wird das klassische Look and Feel des Elements (in diesem Fall ein Schieberegler) von iOS, Android oder Mac übernommen.

Für die Oberflächengestaltung hat man zunächst schnellen Zugriff auf Google’s Material Design und auf das von Microsoft ursprünglich für Windows und XBOX entwickelte Fluent Design, das die flachere und eckigere Metro UI ablöste. Wer die beiden ausgereiften Konzepte ausprobieren oder vergleichen möchte, findet hierfür in der Web-Version der Uno Gallery eine interaktive Möglichkeit. Brandneu ist das Cupertino Design.

Fluent vs Material Design
Material vs Fluent Design [Quelle]

Werkzeuge

Unsere Entwicklungsumgebung der Wahl bleibt Visual Studio. Zu der Unterstützung von Visual Studio for Mac liest mal regelmäßig widersprüchliche Ziele vom Uno-Team, allerdings tangiert mich dieser Aspekt eher weniger. Visual Studio Code und Rider können auf Wunsch natürlich auch für die Entwicklung mit der Uno Platform verwendet werden. Lediglich OmniSharp macht ein bisschen Probleme bei den C# 9.0 Source Generatoren, die von Uno extensiv verwendet werden.

Die simultane Entwicklung mit dem hauseigenen Rapid Application Development (RAD) Werkzeug Blend ist nach eigenen Aussagen geplant, funktioniert jedoch auf einigen Plattform noch nicht optimal. Das Uno-Team empfiehlt hier wärmstens zuerst die UWP-Anwendung zu entwickeln und anschließend die anderen Implementationen, um die Entwicklungsprozesse zu beschleunigen und den Build zu verkürzen. 

Ein besonderes Momentum bekommt Uno Platform momentan auch durch die aktive Entwicklung von bemerkenswerten Third-Party Bibliotheken wie von Syncfusion und Infragistics, die ihre Debugging-Werkzeuge und Bibliotheken zur Verfügung stellen.

Mithilfe von AppCenter, Xamarin.UITest und Selenium vereint Uno.UITest einen plattformübergreifenden Wrapper, wodurch anhand automatisierter Oberflächentests während des Entwicklungsprozesses frühzeitig Fehler vorbeugt werden, dadurch die Effizienz gesteigert wird und in der Continuous Integration (CI) Pipeline zu nützlichen Informationen ausgewertet können die zu sinnvollen DevOps Maßnahmen führen.

Fazit

Es ist spannend mit anzusehen, wie Microsoft seine gesammelten Erfahrungen bündelt und versucht dem gemeinen Entwickler das Produkt der Lessons Learned bereitzustellen und selbst verstärkt wiederzuverwenden. Das sehnlichst erwünschte und stark anpassbare TabView-Control wurde zum Beispiel direkt vom neuen Windows Terminal geborgt.

Nach jahrelanger positiver Erfahrung mit WPF, UWP und WinForms ist nun die Zeit gekommen, zukunftsorientiert auf den geistigen Nachfolger WinUI zu setzen und eine moderne Benutzererfahrung zu gewährleisten.

In der aktuellen .NET 6 Runtime läuft Uno überraschend stabil, ansonsten ist man mit dem nur wenige Monate alten .NET 5 bestens bedient. In Visual Studio stehen 2022 nützliche Projekt Vorlagen zur Verfügung.

Als geeigneten Einstiegspunkt empfiehlt sich das erste Tutorial der Getting Started Sektion der offiziellen Webseite. Wer vor einiger Zeit mal reingeschnuppert hat, kann sich auf GitHub einen Überblick über die aktuellsten Release-Notes zu verschaffen.

Zum Abschluss teile neben ein interessanten Artikeln auch ich ein witziges Projekt, das mich besonders fasziniert hat. Pete Gallager steuert einen Roboterarm unter Linux mit Hilfe der Uno Platform auf seinem Raspberry PI Mini-Computer:

Wolfgang Lutz
Microsoft Certified Solution Developer
im agilen Scrum Team von K&K Software AG


Beitrag vom 01.03.2021 , aktualisiert am 30.07.2021

Kommentar abgeben: