Xamarin.Forms – Projektstruktur und Laufzeitverhalten

Spätestens mit der Übernahme von Xamarin durch Microsoft und der damit verbundenen kostenlosen Verfügbarkeit des Cross-Platform-Framework steht auch reinen .NET-Entwicklern der Weg zu den lukrativen mobilen Plattformen Android und iOS offen.
Um dem Ansatz Write-once-publish-to-all Rechnung zu tragen, haben Solutions hier einige Besonderheiten in ihrer Struktur und Arbeitsweise.

Aufbau der Solution

Eine Solution für Xamarin.Forms besteht immer aus zwei Bestandteilen. Mindestens einem Projekt für die gemeinsam genutzte Codebasis sowie pro Zielplattform ein Projekt für plattformspezifischen Code.

Xamarin Forms - Solution - 29052018 - Mobile - 7KB, generic.de AG

Das geteilte Projekt ist je nach Alter des Template ein .NET-Standard-Projekt oder eine Portable Class Library (PCL).
Obwohl uns das gemeinsame Projekt mit seiner App.xaml auf den ersten Blick vorgaukelt, hier wäre der Einstiegspunkt in die Anwendung, ist dem nicht so. Stattdessen sind die einzelnen plattformspezifischen Projekte die Startprojekte für das jeweilige Ziel-OS. Diese kümmern sich jeweils um die für die verschiedenen Betriebssysteme notwendige Anwendungsinitialisierung und laden dann die gemeinsamen Programmbestandteile.

Xamarin Forms - Projektabhängigkeiten - 29052018 - Mobile - 18KB, generic.de AG

Der große Mehrwert von Xamarin.Forms ist das Konzept hinter den UI-Elementen. Die Oberflächen werden einmalig in der gemeinsamen Codebasis gestaltet. Während der Laufzeit werden diese dann in die dazugehörigen nativen Steuerelemente umgesetzt. Dadurch verhält sich eine Xamarin.Forms App genauso wie eine nativ in Java (Android) oder Swift (iOS) geschriebene.

Paketierung und Ausführung

Um zu verstehen, was und wie auf einem Gerät letztendlich ausgeführt wird, lohnt der Blick auf den Buildprozess einer Xamarin.Forms App. Hier exemplarisch der Ablauf für Android:
1. Der C# Compiler erzeugt die Assembly in der Intermediate Language (IL)
2. Die Mono Assemblies (also das plattformunabhängige .NET Framework) und die in Schritt 1 erzeugten Assemblies werden vom Linker gefiltert. Nur die in der Anwendung benötigten werden verwendet.
3. Die Assemblies aus Schritt 2 und eine Mono Runtime (die Mono VM) werden vom Android apkbuilder zu einem Installationspaket (APK-File) zusammengepackt.

Xamarin Forms - Paketierung und Ausführung - 29052018 - Mobile - 11KB, generic.de AG

Während der Laufzeit laufen in der App dann die im System vorhandene Android Runtime und die mit der App mitgelieferte Mono Runtime parallel nebeneinander und führen einerseits die nativen Android- und Javabibliotheken aus, andererseits unseren Programmcode und die .NET-Bibliotheken.

Im zweiten Teil unserer Serie zu Xamarin werden wir uns das altbewährte MVVM-Framework PRISM anschauen. Das Team um Brian Lagunas hat sich für die Xamarin.Forms Version von PRISM mächtig ins Zeug gelegt und es lohnt sich, mehr als einen Blick zu riskieren.