Die Kladde läuft nach K2 im Browser. Dieser Kurs gibt ihr eine zweite Oberfläche: eine App für Telefon und Desktop, geschrieben mit C# und XAML, aus einer einzigen Codebasis. Das Werkzeug dafür heißt .NET MAUI. Diese Lektion klärt, was es ist und was es nicht ist, richtet Ihren Rechner ein und startet die Vorlage auf einem Android-Emulator und unter Windows. Am Ende liegt src/Kladde.App neben den Projekten aus K2, und Sie haben mit Hot Reload gesehen, wie schnell man in diesem Projekttyp eine Oberfläche ändern kann.

Der Kurs setzt K2 voraus: C# und async, die Web-API der Kladde mit ihrer Anmeldung, die Buchungsansicht als Blazor-Komponente und xUnit. Das wiederholt dieser Kurs nicht. Wo er darauf aufbaut, steht ein Verweis.

Modul Lektion Was entsteht
W2.1 W2.1.1 .NET MAUI im Überblick das Projekt Kladde.App, startbar auf Android und Windows
W2.1 W2.1.2 XAML, Steuerelemente und Layouts Kontaktliste und Termine des Tages als Seiten mit Shell
W2.2 W2.2.1 MVVM die Seiten als ViewModels, getestet ohne Gerät
W2.2 W2.2.2 Daten: API, offline, sicher gespeichert Termine aus der Web-API, auch ohne Netz
W2.3 W2.3.1 Blazor Hybrid die Buchungsansicht als gemeinsame Komponente
W2.3 W2.3.2 Testen, ausliefern, verteilen ein Android-Paket und ein MSIX-Paket

Was .NET MAUI ist

.NET Multi-platform App UI, kurz .NET MAUI, ist ein Rahmenwerk für native Apps für Mobilgeräte und Desktop mit C# und XAML. Aus einer gemeinsamen Codebasis entstehen Apps für Android, iOS, macOS und Windows. Es ist quelloffen und die Weiterentwicklung von Xamarin.Forms, vom Mobilen auf den Desktop erweitert, mit Steuerelementen, die von Grund auf neu gebaut wurden.

Wichtig für das Verständnis ist, was MAUI nicht tut: Es zeichnet keine eigene Oberfläche, die überall gleich aussieht. Ihr Code spricht mit der Schicht der MAUI-Steuerelemente, und diese Schicht benutzt die Steuerelemente der jeweiligen Plattform. Bei Bedarf kann Ihr Code auch die Plattform direkt aufrufen. Darunter liegt die .NET-Klassenbibliothek, die für alle Plattformen dieselbe ist; deshalb lassen sich Fachlogik, Tests und Modelle teilen.

Zielplattform Wie sie gebaut wird Laufzeit und Übersetzung
Android .NET für Android C# wird zu IL kompiliert und beim Start der App zu nativem Code übersetzt (JIT)
iOS .NET für iOS vollständig vorab (AOT) in nativen ARM-Code kompiliert
macOS Mac Catalyst von Apple: die mit UIKit gebaute iOS-App läuft auf dem Desktop, ergänzt um AppKit und Plattform-Aufrufe Mono
Windows Windows UI 3 (WinUI 3) die .NET-Laufzeit (CLR)

Für Android, iOS und macOS ist die Laufzeit nach Learn Mono, für Windows die .NET-Core-CLR. Für diesen Kurs genügt, dass Sie auf Android und Windows üben und dieselbe Oberfläche auf beiden sehen.

Was MAUI mitbringt

  • Steuerelemente, um Daten anzuzeigen, Aktionen auszulösen, Sammlungen darzustellen und Werte zu wählen,
  • eine Layout-Engine und mehrere Seitentypen, darunter die Shell für die Navigation,
  • Datenbindung, die Sie in W2.2.1 für MVVM brauchen,
  • plattformübergreifende Schnittstellen für Gerätefunktionen: Sensoren, Netzstatus, Geräteinformationen, Zwischenablage, Dateiauswahl, sicher gespeicherte Schlüssel-Wert-Paare, Sprachausgabe und Anmeldeabläufe im Browser, die bei einer App-Adresse zurückkehren,
  • ein Zeichenfeld für eigene Grafik,
  • ein Projekt für alle Plattformen und Hot Reload.

Die Schnittstellen für Netzstatus und sichere Speicherung benutzen Sie in W2.2.2.

Für wen und wofür

Learn nennt drei Gründe für MAUI: Sie schreiben plattformübergreifende Apps in XAML und C# aus einer Codebasis, Sie teilen Layout und Gestaltung, und Sie teilen Code, Tests und Fachlogik. Für die Kladde heißt das: Die Regeln, die Sie in K1 und K2 schon haben, bleiben C#. Neu ist die Oberfläche.

Was MAUI in diesem Kurs nicht ist

  • Keine Schule für iOS. Für iOS braucht es einen Mac im Netz; der Kurs beschreibt den Weg, die Übungen laufen auf Android und Windows.
  • Keine Spieleentwicklung.
  • Keine Einführung in C# oder in Entra ID. Beides bringen Sie aus K0 bis K2 mit.
  • Keine zweite Webseite. Wer Webtechnik in der App nutzen will, bekommt in W2.3.1 Blazor Hybrid.

Plattformgrenzen: was MAUI in .NET 10 braucht

Auf Microsoft Learn steht für .NET 10 folgende Mindestausstattung der Ziele:

Plattform Mindestens
Android Android 5.0 (API 21)
iOS iOS 12.2
macOS macOS 12 über Mac Catalyst
Windows Windows 11, oder Windows 10 ab Version 1809, über WinUI 3

Apps mit Blazor in MAUI (W2.3) haben strengere Grenzen: Android 7.0 (API 24), iOS 16.4 und macOS 12, dazu eine aktuelle WebView der Plattform. Samsung liefert zusätzlich eine Unterstützung für Tizen; sie ist nicht Teil dieses Kurses.

Zwei Dinge sollten Sie schon jetzt mitnehmen. Erstens: Die Vorlagen von .NET 10 setzen für Android den Wert SupportedOSPlatformVersion auf 24 statt 21. API 21 wird weiter unterstützt; Learn empfiehlt aber, bestehende Projekte auf 24 zu heben, damit Abstürze durch fehlende Java-Funktionen ausbleiben. Zweitens: Für .NET 11 nennt Learn als Mindestwert für Android die API 24. Der Kurs bleibt bei .NET 10, die Zahl ist nur ein Ausblick.

Welche Versionen von Xcode, Android-SDK, JDK und Windows App SDK zu einer MAUI-Version passen, ändert sich mit jeder Ausgabe. Learn verweist dafür auf die Tabelle „Release versions“ im GitHub-Wiki von dotnet/maui. Dieser Kurs nennt deshalb keine Nummern. Schlagen Sie vor dem Einrichten dort nach.

Werkzeuge

Sie haben zwei Wege, und beide sind in Ordnung:

Visual Studio Visual Studio Code
Voraussetzung Visual Studio 2022 ab 17.12 mit der Workload „.NET Multi-platform App UI development“ Visual Studio Code mit der Erweiterung „.NET MAUI“
Weitere Erweiterungen keine C# Dev Kit und C#, die die MAUI-Erweiterung selbst mitinstalliert
Konto C# Dev Kit verlangt die Anmeldung mit einem Microsoft-Konto, das ein aktives Visual-Studio-Abonnement hat; die Lizenzfragen stehen im FAQ zu C# Dev Kit

Ihr Betriebssystem bestimmt, was Sie bauen können (Visual Studio erreicht iOS von Windows aus über einen Mac im Netz):

Ihr Betriebssystem Ziele
Windows Windows, Android
macOS Android, iOS, macOS
Linux Android

Apps für iOS und Mac Catalyst bauen, signieren und installieren Sie nur auf einem Mac mit passender Xcode-Version. Mit einer Apple-ID und der Mitgliedschaft im Apple Developer Program lassen sich Geräte bespielen und Apps in den Store bringen. Für Debug-Builds gibt es von Windows aus „Hot Restart“ auf ein iOS-Gerät; auch das setzt die kostenpflichtige Mitgliedschaft voraus. Learn nennt für Mac Catalyst nur Visual Studio Code als Werkzeug zum Starten und Debuggen. Das sind die Gründe, warum dieser Kurs iOS beschreibt, aber nicht übt.

Der Workload

Das Rahmenwerk kommt in .NET 10 als .NET-Workload und als mehrere NuGet-Pakete. Der Vorteil: Sie können ein Projekt an eine bestimmte Version binden und Vorabversionen leicht ausprobieren. Ohne Visual Studio installieren Sie ihn so:

PowerShell
dotnet workload install maui

Unter Windows und macOS erscheint danach in der Liste der Workload maui:

PowerShell
dotnet workload list

Haben Sie ihn mit dem Visual-Studio-Installer eingerichtet, stehen dort stattdessen android, maui-windows, maccatalyst und ios. Unter macOS braucht der erste Befehl sudo; unter Linux heißt der Workload maui-android.

Android einrichten

Für Android brauchen Sie das Java-SDK, das Android-SDK und einen Emulator. Mit Visual Studio übernimmt das der erste Start einer Android-App: Es lädt das Standard-SDK, legt einen virtuellen Android-Geräte-Eintrag an (AVD) und fragt mehrmals nach den Lizenzen. Bestätigen Sie sie nur, wenn Sie sie gelesen haben.

Mit Visual Studio Code gibt es mehrere Wege. Der empfohlene benutzt ein MSBuild-Ziel, das die Abhängigkeiten selbst installiert, wenn Sie ein Projekt haben:

PowerShell
dotnet new maui -n "MeineApp"
cd MeineApp
dotnet build -t:InstallAndroidDependencies -f:net10.0-android -p:AndroidSdkDirectory="C:\Android\Sdk" -p:AcceptAndroidSDKLicenses=True

Learn zeigt dieses Beispiel mit net9.0-android. Für .NET 10 heißt die Zielplattform net10.0-android. Der Pfad zum SDK sollte weder Leerzeichen noch Nicht-ASCII-Zeichen enthalten. Mit -p:AcceptAndroidSDKLicenses=True erklären Sie, dass Sie die Lizenzen angenommen haben. Der Pfad C:\Android\Sdk ist hier nur ein Beispiel.

Die Erweiterung für Visual Studio Code prüft die Umgebung mit dem Befehl .NET MAUI: Configure Android und der Auswahl Refresh Android environment. Sie sucht JAVA_HOME und ANDROID_HOME; Learn empfiehlt, beide Umgebungsvariablen zu setzen. Welche Version des JDK passt, steht nicht einheitlich in Learn: Die Installationsseite nennt das Microsoft Build of OpenJDK 17, die Seite zu den Neuerungen in .NET 10 sagt, dass .NET für Android jetzt auch mit JDK 21 baut. Maßgeblich ist die Tabelle „Release versions“.

Ein Emulator läuft nur schnell, wenn die Hardwarebeschleunigung eingeschaltet ist. Learn warnt ausdrücklich, dass er sonst sehr langsam läuft. Unter Windows auf ARM (zum Beispiel Surface Pro X) läuft der Android-Emulator nicht, weil er x64 braucht; dort nehmen Sie ein echtes Gerät per USB. Der Emulator hat keine virtuelle Hardware für Bluetooth, NFC, SD-Karte, Kopfhörer und USB.

Windows als Ziel

Windows als Ziel braucht keinen Emulator: Die App läuft als Fenster auf dem Rechner, auf dem Sie entwickeln. Ein neues MAUI-Projekt wird nach Learn standardmäßig als unverpackte App bereitgestellt. Für verpackte Apps (MSIX) muss der Entwicklermodus von Windows eingeschaltet sein: Einstellungen, Datenschutz und Sicherheit, „Für Entwickler“ (Windows 11), dort „Entwicklermodus“. Das Einschalten verlangt Administratorrechte und kann auf Geräten einer Firma gesperrt sein. Fragt Visual Studio beim Bauen nach dem Entwicklermodus, folgen Sie dem Link zu den Einstellungen für Entwickler. Die Bezeichnungen der Einstellungsseiten ändern sich zwischen Windows-Versionen.

Die Vorlage anlegen

Auf der Kommandozeile erzeugt dotnet new maui ein Projekt mit XAML-Oberfläche. Das ist der kürzeste Weg, und er sieht in beiden Werkzeugen gleich aus:

PowerShell
dotnet new maui -n Kladde.App -o src\Kladde.App

Mit Visual Studio wählen Sie Create a new project, filtern auf MAUI, nehmen die Vorlage .NET MAUI App, geben Namen und Ort an und wählen die .NET-Version. Mit Visual Studio Code ist es Create .NET Project (oder .NET: New Project… in der Befehlspalette) und die Vorlage .NET MAUI App; das Projekt muss in einem leeren Ordner entstehen.

Lassen Sie sich vom Namen nicht stören: Kladde.App ist der Projektname und zugleich der Standard-Namensraum der Klassen.

Was die Vorlage anlegt

Learn nennt vier wichtige Codedateien:

Datei Aufgabe
MauiProgram.cs der gemeinsame Einstieg: baut und startet die App
App.xaml und App.xaml.cs Ressourcen für die ganze App wie Farben und Stile; der Code erzeugt das Fenster
AppShell.xaml und AppShell.xaml.cs die Gliederung der App: Tabs, Menü und Seiten
MainPage.xaml und MainPage.xaml.cs die Startseite der Vorlage mit der Schaltfläche „Click me“

Dazu kommen die Ordner Platforms und Resources. Beginnen Sie mit der Einstiegsklasse:

C#
namespace MyMauiApp;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>();

        return builder.Build();
    }
}

So sieht die kleinste mögliche Fassung aus. Die Vorlage hängt weitere Zeilen an den Builder, zum Beispiel für Schriften. Jede Plattform ruft CreateMauiApp auf und bekommt eine MauiApp zurück. Es gibt also genau einen Einstieg, auch wenn vier Plattformen starten. Registrierungen für Dependency Injection kommen später dazu, in W2.2.1.

Die Klasse App leitet von Application ab und erzeugt das Fenster:

C#
namespace MyMauiApp;

public class App : Application
{
    public App()
    {
        InitializeComponent();
    }

    protected override Window CreateWindow(IActivationState? activationState)
    {
        return new Window(new AppShell());
    }
}

AppShell ist eine von Shell abgeleitete Klasse, die die sichtbare Gliederung der App beschreibt. Die Seite der Vorlage, MainPage, leitet von ContentPage ab. Beim Start läuft die Kette: MauiProgram baut die App, der Konstruktor von App entsteht, CreateWindow erzeugt AppShell, und AppShell zeigt MainPage. Dessen Konstruktor ruft InitializeComponent, das die Objekte aus der XAML-Datei anlegt, sie zu einem Baum verbindet und als Inhalt der Seite setzt.

Vor .NET 9 stand in App stattdessen eine Zuweisung an MainPage. Wenn Sie ältere Beispiele finden, die MainPage = new AppShell(); schreiben, ist das die alte Form. Mit .NET 10 gilt CreateWindow.

Ein Projekt, mehrere Plattformen

MAUI arbeitet mit einem Projekt: einem SDK-Projekt, das mehrere Zielplattformen anspricht (Multi-Targeting). Das bringt Learn so auf den Punkt: ein gemeinsames Projekt für alle Plattformen, eine vereinfachte Auswahl des Ziels zum Starten, gemeinsame Ressourcedateien, ein einziges Manifest mit Titel, ID und Version der App, Zugriff auf plattformspezifische Schnittstellen, und ein gemeinsamer Einstieg.

Der Ordner Platforms hat je Plattform einen Unterordner mit den plattformspezifischen Ressourcen und dem Code, der die App dort startet. Beim Bauen für Android gehen nur die Dateien aus Platforms\Android in das Paket, nicht die der anderen. Wo Sie plattformeigenen Code brauchen, nutzen Sie partielle Klassen oder die bedingte Kompilierung:

C#
#if ANDROID
                  handler.PlatformView.SetBackgroundColor(Colors.Red.ToPlatform());
#elif IOS
                  handler.PlatformView.BackgroundColor = Colors.Red.ToPlatform();
                  handler.PlatformView.BorderStyle = UIKit.UITextBorderStyle.Line;
#elif WINDOWS
                  handler.PlatformView.Background = Colors.Red.ToPlatform();
#endif

Dieses Beispiel aus Learn setzt die Hintergrundfarbe eines Steuerelements: Jede Plattform hat dafür ihren eigenen Aufruf. In diesem Kurs brauchen Sie solchen Code nicht; er zeigt nur, dass der Weg zur Plattform offen bleibt.

Der Ordner Resources enthält die gemeinsamen Ressourcen. Jede Bilddatei dient als Quelle, aus der beim Bauen die Auflösungen der Plattformen erzeugt werden. Welche Ordner gelten, stellt die Projektdatei ein; die Aktion ergibt sich aus dem Ordner:

Ressource Aktion in der Projektdatei Ordner der Vorlage
App-Symbol MauiIcon Resources\AppIcon
Bilder MauiImage Resources\Images
Schriften MauiFont Resources\Fonts
Startbild MauiSplashScreen Resources\Splash
Rohdateien MauiAsset Resources\Raw
CSS-Dateien MauiCss beliebig
XML
<ItemGroup>
    <!-- Images -->
    <MauiImage Include="Resources\Images\*" />

    <!-- Fonts -->
    <MauiFont Include="Resources\Fonts\*" />

    <!-- Raw assets -->
    <MauiAsset Include="Resources\Raw\*" />
</ItemGroup>

XAML-Dateien bekommen automatisch die Aktion MauiXaml. Eine plattformeigene Ressource, etwa ein Bild in Platforms\Android\Resources\drawable-xhdpi, gewinnt gegen die gemeinsame. Titel, ID und Version der App stehen in einem Ort und werden beim Bauen mit dem Manifest jeder Plattform zusammengeführt; in Visual Studio finden Sie sie unter den Eigenschaften des Projekts bei MAUI Shared.

Was neu ist in .NET 10

Die Seite „What’s new in .NET MAUI for .NET 10“ ist lang. Für Ihre Arbeit zählt Folgendes. Die Liste zeigt außerdem, was Sie in alten Tutorials nicht mehr nachbauen sollten:

Bereich Stand in .NET 10
Auslieferung .NET-Workload plus NuGet-Pakete; Projekte lassen sich an Versionen binden
Android die API 36 ist Standard; die Vorlagen setzen die Mindestversion 24; es lässt sich mit JDK 21 bauen
Start dotnet run funktioniert jetzt für Android, mit -p:AdbTarget=-e für den laufenden Emulator oder -d für ein angeschlossenes Gerät
Marshal-Methoden in .NET 10 eingeschaltet; Probleme zeigen sich oft als Hänger beim Start, dann AndroidEnableMarshalMethods auf false
CoreCLR auf Android experimentell, nicht für den Betrieb gedacht
XAML ein Quellgenerator (MauiXamlInflator), mehr dazu in W2.1.2; globale und implizite Namensräume als Vorschau-Merkmal
Aspire eine Vorlage für ein Service-Defaults-Projekt für MAUI (OpenTelemetry, Diensterkennung)
abgekündigt ListView und seine Zellen, TableView: stattdessen CollectionView; DisplayAlert und DisplayActionSheet: stattdessen DisplayAlertAsync und DisplayActionSheetAsync; FadeTo, ScaleTo und die anderen Animationen: stattdessen die Varianten mit Async; Page.IsBusy: stattdessen ActivityIndicator
entfernt oder intern ClickGestureRecognizer entfernt (TapGestureRecognizer); MessagingCenter intern (Ersatz: WeakReferenceMessenger aus CommunityToolkit.Mvvm)

Die Zeile zur Android-API 36 hatte bei den Vorabversionen eine Falle: Visual Studio und Visual Studio Code kannten die Version noch nicht und meldeten den Fehler XA5207. Ob das mit Ihrer Werkzeugversion noch eine Rolle spielt, sehen Sie am Fehlertext.

Android-Apps starten Sie damit auch auf der Kommandozeile, wenn ein Emulator läuft:

PowerShell
dotnet run -f net10.0-android -p:AdbTarget=-e

Learn zeigt dotnet run -p:AdbTarget=-e ohne -f. Ein MAUI-Projekt hat mehrere Zielplattformen; -f ist die Option von dotnet run, die eine auswählt.

Starten: Emulator und Windows

Visual Studio. Wählen Sie in der Symbolleiste im Menü Debug Target die Android-Emulatoren und einen Eintrag, oder Windows Machine. Beim ersten Android-Start richtet Visual Studio SDK und Emulator ein (siehe oben). Die Vorlage hat die Schaltfläche Click me; jedes Drücken erhöht einen Zähler.

Visual Studio Code. Prüfen Sie zuerst die Umgebung (.NET MAUI: Configure Android, dann Refresh Android environment). In der Statusleiste unten stellt ein Klick auf die geschweiften Klammern { } das Debug Target ein; die Befehle .NET MAUI: Pick Android Device und .NET MAUI: Pick Windows Device tun dasselbe. Gestartet wird mit F5 oder der Schaltfläche Run. Fragt Visual Studio Code nach einem Debugger, wählen Sie C# und die Startkonfiguration Ihres Projekts.

iOS und Mac, beschrieben. Mit Visual Studio unter Windows koppeln Sie einen Mac als Build-Host (Pair to Mac). Danach wählen Sie als Ziel einen iOS-Simulator; Visual Studio baut, startet den „Remote iOS Simulator for Windows“ und installiert die App dort. Auf dem Mac selbst arbeiten Sie mit Visual Studio Code, wählen .NET MAUI: Pick iOS Device und starten mit F5. Für ein echtes iOS-Gerät brauchen Sie die Apple-ID in Xcode, einen eingeschalteten Entwicklermodus auf dem Gerät und, im Developer Program, die Registrierung des Geräts im Team.

Fehler, die oft sind

Beobachtung Was Sie prüfen
Der Emulator ist sehr langsam ist die Hardwarebeschleunigung eingeschaltet (Hyper-V und AEHD)?
Es gibt keinen Emulator unter Windows auf ARM der Emulator braucht x64; benutzen Sie ein Gerät per USB
dotnet workload list zeigt kein maui wurde Visual Studio mit der Workload eingerichtet (dann stehen android, maui-windows, maccatalyst, ios da) oder dotnet workload install maui ausgeführt?
Android-Lizenzen sind nicht angenommen in einem Terminal mit Administratorrechten im Ordner cmdline-tools/<Version>/bin des Android-SDK sdkmanager --licenses ausführen
App hängt beim Start auf .NET 10 AndroidEnableMarshalMethods auf false versuchen; hilft das, melden Sie es als Issue im Repository dotnet/android
Windows fragt nach dem Entwicklermodus siehe den Abschnitt zu Windows; für unverpackte Apps ist er nach Learn nicht nötig

Für alles, was hier nicht steht, führt die Seite „Troubleshooting known issues“ in der MAUI-Dokumentation weiter.

Hot Reload

Hot Reload ist der Grund, warum die Arbeit an einer App angenehm sein kann. Zwei Arten gibt es:

  • .NET Hot Reload wendet Änderungen an C#-Code an, während die App läuft, ohne neu zu bauen und ohne dass Sie anhalten oder einen Haltepunkt erreichen müssen.
  • XAML Hot Reload wendet gespeicherte oder getippte Änderungen an XAML an. Der Zustand der Navigation und die Daten bleiben erhalten, weil die Seite nicht neu aufgebaut wird; nur die geänderten Eigenschaften werden gesetzt.

Voraussetzungen und Grenzen nach Learn:

Punkt Aussage
Konfiguration die App läuft in der Konfiguration Debug mit angehängtem Debugger; die Konfiguration muss genau so heißen
Werkzeug Visual Studio 2022 und Visual Studio Code
Ziele XAML Hot Reload gibt es unter Windows für Android, iOS und WinUI, auf Emulatoren, Simulatoren und echten Geräten
Speichern in Visual Studio gilt standardmäßig jede Änderung beim Tippen; die Option „Apply XAML Hot Reload on document save“ schaltet auf Speichern um
C# in XAML XAML Hot Reload lädt keinen C#-Code neu: Ein neuer Ereignis-Handler im Code geht erst nach einem Reload des Codes im XAML; ein neuer Name mit x:Name ebenso
Dateien keine Dateien oder NuGet-Pakete hinzufügen, entfernen oder umbenennen: dann neu bauen und neu bereitstellen
Fehler ein Fehler in der XAML-Datei, Fehlercode XHR…, hält alle Änderungen auf, bis er behoben ist
Neu laden die Schaltfläche Hot Reload oder Alt+F10 lädt die geänderte Seite ganz neu; Fokus und Auswahl können dabei verloren gehen
Ressourcen ändern Sie ein Ressourcenwörterbuch, werden alle XAML-Dateien neu geladen

Learn nennt außerdem als Fehlerquelle, wenn Hot Reload ohne Meldung nichts tut: Alle .cs-Dateien müssen als UTF-8 mit BOM gespeichert sein. Dateien ohne BOM, wie viele Editoren sie unter Linux oder macOS erzeugen, können dazu führen, dass XAML Hot Reload still versagt. In Visual Studio Code stellen Sie das in der Statusleiste mit Save with Encoding ein. Die Ausgabe des Hot-Reload-Fensters (in Visual Studio unter View, Output, Hot Reload) zeigt Statusmeldungen.

Übung 1

Die Vorlage starten. Starten Sie die Vorlage auf dem Android-Emulator und unter Windows.

  1. Legen Sie in einem leeren Ordner außerhalb der Kladde ein Projekt an, das Sie nach der Übung wieder löschen: dotnet new maui -n MauiProbe.
  2. Öffnen Sie es in Visual Studio oder Visual Studio Code.
  3. Wählen Sie als Ziel einen Android-Emulator. Beim ersten Mal richtet Ihr Werkzeug SDK und Emulator ein.
  4. Starten Sie die App, drücken Sie Click me viermal.
  5. Stoppen Sie die App, wählen Sie Windows als Ziel (Windows Machine oder Pick Windows Device) und starten Sie die App erneut.

So prüfen Sie: Auf beiden Zielen erscheint dieselbe Seite, und der Zähler steht nach vier Drücken bei vier. Im Emulator finden Sie die App zusätzlich in der Liste der installierten Apps. Läuft der Emulator spürbar zäh, lesen Sie nach, ob die Hardwarebeschleunigung eingeschaltet ist.

Lösung 1

Alle Schritte sind in den Abschnitten oben beschrieben. Ein Befehlszeilenweg für Android, wenn der Emulator schon läuft:

PowerShell
cd MauiProbe
dotnet run -f net10.0-android -p:AdbTarget=-e

Für Windows nehmen Sie das Ziel in Ihrem Werkzeug; der Kurs startet die Windows-App aus Visual Studio oder Visual Studio Code. Bricht der erste Android-Start mit einer Fehlermeldung zu Lizenzen ab, hilft sdkmanager --licenses (siehe die Tabelle der Fehler).

Aufräumen: Beenden Sie den Emulator, wenn Sie ihn nicht mehr brauchen; er belegt Arbeitsspeicher und Festplatte, bis Sie das virtuelle Gerät löschen (Android Device Manager). Es entstehen keine Kosten.

Übung 2

Hot Reload ausprobieren. Starten Sie die Vorlage aus Übung 1 mit dem Debugger (F5 oder die grüne Schaltfläche, nicht „ohne Debugging“).

  1. Öffnen Sie MainPage.xaml, ändern Sie den Text einer Überschrift und speichern Sie. Die laufende App zeigt den neuen Text, und der Zähler behält seinen Stand.
  2. Ändern Sie in derselben Datei die Hintergrundfarbe oder den Außenabstand einer Zeile.
  3. Öffnen Sie MainPage.xaml.cs, suchen Sie die Methode, die beim Drücken der Schaltfläche den Zähler erhöht, und ändern Sie den Text, den sie setzt. Wenden Sie die Änderung an (in Visual Studio die Schaltfläche Hot Reload).
  4. Fügen Sie in der XAML-Datei ein neues Steuerelement mit x:Name hinzu und greifen Sie im Code darauf zu. Beobachten Sie, was passiert.

So prüfen Sie: Schritte 1 und 2 zeigen die Wirkung ohne Neustart, mit unverändertem Zähler. Bei Schritt 4 geht der neue Name erst nach einem Neubau, weil XAML Hot Reload den C#-Code nicht neu lädt.

Lösung 2

Schritt 3 ändert C#-Code, nicht XAML; er hängt von .NET Hot Reload ab. Welche Codeänderungen sich anwenden lassen, ohne die App neu zu bauen, hängt von der Art der Änderung ab; Learn beschreibt auf der Seite zu .NET Hot Reload, was nicht geht. Zeigt sich nichts, prüfen Sie die Punkte der Tabelle: Konfiguration Debug, Debugger angehängt, keine XHR-Fehler, .cs-Dateien mit BOM. Schritt 4: Nach einem Neubau und Neustart der App gilt der Name. Merken Sie sich die Regel für die Praxis: XAML ohne x:Name und ohne neue Ereignisse lässt sich im Lauf der App ändern, alles andere braucht einen Neubau.

Übung 3

Kladde.App anlegen. Legen Sie das Projekt für die Kladde an.

  1. Wechseln Sie in den Hauptordner Ihrer Kladde (dort, wo Kladde.slnx und der Ordner src liegen).
  2. Legen Sie das Projekt an: dotnet new maui -n Kladde.App -o src\Kladde.App.
  3. Öffnen Sie src\Kladde.App\Kladde.App.csproj in Ihrem Werkzeug und starten Sie die App auf Android und Windows, wie in Übung 1.
  4. Setzen Sie in den Eigenschaften des Projekts (in Visual Studio MAUI Shared, General) den Titel auf „Kladde“. Lassen Sie die ID in der Form com.<ihr-name>.kladde, mit einem Namen Ihrer Wahl, und die Version auf 1.0.
  5. Stoppen Sie die App. Nehmen Sie src\Kladde.App ins Repository auf, in einem Branch feature/maui-app, mit einer Commit-Nachricht wie feat(app): MAUI-Vorlage als Kladde.App.

So prüfen Sie: Das Projekt startet auf Android und Windows und zeigt die Seite der Vorlage; git status zeigt src/Kladde.App mit den Dateien der Vorlage, aber ohne die Ordner bin und obj. Stehen sie dort, ergänzen Sie bin/ und obj/ in der .gitignore.

Lösung 3

Der Befehl legt neben den K2-Projekten ein Verzeichnis src/Kladde.App an. Die Vorlage erzeugt Namensräume nach dem Projektnamen: Ihre Klassen stehen im Namensraum Kladde.App. In die Lösungsdatei Kladde.slnx nehmen Sie das Projekt in diesem Modul noch nicht auf: Ob und wie die App dort hineinkommt, legt W2.2.1 fest, wenn es die ersten Tests gibt, weil dann geklärt werden muss, was ein Aufruf von dotnet build oder dotnet test für die Lösung bauen soll. Learn warnt aus einem anderen Grund vor Lösungen mit MAUI-Projekt: Ein dotnet publish auf einer Lösung versucht jedes Projekt einzeln zu veröffentlichen. Veröffentlichen Sie deshalb immer das App-Projekt selbst.

Die ID der App ist eine Zeichenkette nach dem Muster einer umgekehrten Domain. Sie ist keine Adresse, die erreichbar sein muss. Wählen Sie sie bewusst; später, wenn Sie die App verteilen, hängt vieles an ihr (W2.3.2).

Aufräumen: Löschen Sie den Ordner MauiProbe aus Übung 1 und 2.

Die Kladde: eine App neben der Webanwendung

Mit dieser Lektion hat die Kladde ein neues Projekt: src/Kladde.App, eine App, die auf Android und Windows startet und noch die Seite der Vorlage zeigt. Die Projekte aus K2 (Kladde.Core, Kladde.Data, Kladde.Web und die übrigen) ändern Sie nicht. Die App wird die Web-API der Kladde nutzen, ab W2.2.2, und die Regeln der Kladde bleiben dort, wo sie sind. In W2.1.2 bauen Sie die ersten eigenen Seiten: eine Kontaktliste und die Termine des Tages, noch mit festen Beispieldaten im Code.

Was Sie jetzt können

  • Sie erklären, was .NET MAUI ist, wie die vier Plattformen angesprochen werden und was nach Learn in .NET 10 mindestens vorausgesetzt ist.
  • Sie richten Workload, Android-SDK, Emulator und Windows als Ziel ein und wissen, was für iOS fehlt: ein Mac im Netz.
  • Sie ordnen MauiProgram, App, AppShell, Platforms und Resources zu und wissen, wo plattformeigener Code steht.
  • Sie starten die App auf einem Android-Emulator und unter Windows und nutzen Hot Reload, mit seinen Grenzen.
  • Sie kennen die Neuerungen und Abkündigungen von .NET 10, die in älteren Tutorials noch anders stehen, und haben Kladde.App angelegt.

Weiterlesen