Xamarin.Forms Projekt mit .NET Standard

Wenn man in Visual Studio ein neues Xamarin.Forms Projekt anlegt, so hat man bei den Strategien für das Teilen des Codes nur  zwei Varianten zur Auswahl: Shared Project oder Portable Class Library. Ich persönlich kann hier von dem Shared Project nur abraten, da hierbei die Dateien in die plattformspezifischen Projekte gelinkt werden und man so mit Compiler-Direkten arbeiten muss, wenn sich der Code auf unterschiedlichen Plattformen anders verhalten soll. Aber auch die Portable Class Library kann ich nicht bedingungslos empfehlen, da ich hier nur ein Subset von .NET zur Verfügung habe. Meine Empfehlung wäre hier .NET Standard. Derzeit gibt es hierfür noch kein Template, aber ich zeige euch in diesem Beitrag, wie ihr mit wenig Aufwand aus der PCL eine .NET Standard Class Library machen könnt.

Zunächst legen wir eine neue Xamarin.Forms App in Visual Studio an. Als UI-Framework wählen wir natürlich Xamarin.Forms und als Code Sharing Strategy wählen wir Portable Class Library.

Nun fügen wir ein weiteres Projekt zur bestehenden Solution hinzu. Hierbei wählen wir aus der Gruppe .NET Standard die Class Library (.NET Standard) aus. Hier wählen wir als Namen APPNAME.Core. Diesen Namen und auch den Namespace werden wir im Laufe noch anpassen.

Nun ziehen wir per Drag & Drop die beiden Dateien App.xaml und MainPage.xaml von dem Portable-Projekt in das erzeugte Core-Projekt. Anschließend können wir das Portable-Projekt entfernen, da wir dieses nicht mehr benötigen. Ebenso können wir aus dem Core-Projekt die Datei Class1.cs löschen.

Nun können wir das Core-Projekt umbenennen und das Core aus dem Namen entfernen. Dadurch passen jetzt auch wieder alle Namespaces.

In den Eigenschaften zu dem Projekt können wir jetzt ein Target Framework angeben. Sofern wir derzeit UWP-Apps unterstützen möchten, können wir maximal .NET Standard 1.4 auswählen. Anschließend können wir Xamarin.Forms als NuGet-Package wieder hinzufügen. Mit der aktuellen Stable-Version ist nicht jedoch nicht möglich, so dass wir hier auf das aktuelle Pre-Release zurückgreifen müssen.

Nun fügen wir unser .NET Standard Projekt als Referenz zu den plattformspezifischen Projekten hinzu. Um nun weitere Kompatibilität mit älteren NuGet-Paketen  zu gewährleisten, installieren wir via NuGet noch das Package Microsoft.NETCore.Portable.Compatibility in unserem .NET Standard Projekt hinzu.

Anschließend müssen wir noch die .csproj-Datei editieren. Dies kann man bequem über das Kontextmenü des Projektes vornehmen. Hier editieren wir die oberste PropertyGroup.

<PropertyGroup>
  <TargetFramework>
    netstandard1.4
  </TargetFramework>
  <PackageTargetFallback>
    $(PackageTargetFallback);portable-win+net45+wp8+win81+wpa8
  </PackageTargetFallback>
</PropertyGroup>

Damit sind wir jetzt in der Lage auch ältere Pakete einzubinden, welche nur eine Portable-Variante anbieten. Gleichzeitig sind wir jetzt auch generell mit der Portierung nach .NET Standard fertig und unsere Apps laufen nun genauso wie vorher.

Solange es noch kein Template für .NET Standard und Xamarin.Forms gibt, kann ich diese wenige Schritten empfehlen, um so in den Genuss von .NET Standard zu kommen. Schaut man sich jetzt jedoch die Ordner-Struktur an, welche durch Visual Studio angelegt wurde, merkt man, dass man hier noch ein wenig Aufräumarbeiten durchführen muss.

Ich habe daher ein GitHub-Repository angelegt, welches einmal zeigt, wie so eine Solution mit .NET Standard als Code-Sharing Strategie aussehen kann.

Pokédex – Kleines Xamarin.Forms Projekt – Teil 4 Nikolaus-Hackathon in Karlsruhe Einrichten von GitHub Sponsors für ein persönliches Konto