Der .NET-Upgrade-Assistent führt uns durch eine Reihe von klar definierten Schritten, um bestehende Anwendungen schrittweise zu aktualisieren, wodurch das Risiko von Fehlern minimiert und die Entwicklungszeit verkürzt wird. Die Zielgruppe des .NET-Upgrade-Assistenten sind in erster Linie Entwickler:innen und Teams, die bestehende Anwendungen auf neuere und leistungsfähigere .NET-Versionen portieren möchten.
ZUM NEWSLETTER
Regelmäßig News zur Konferenz und der .NET-Community
Unterstützte Projekttypen und Upgrade-Pfade
Der .NET-Upgrade-Assistent unterstützt eine Vielzahl von Projekttypen, die für die Migration auf moderne .NET-Versionen geeignet sind. Zu den unterstützten Projekten gehören [1]:
- ASP.NET
- Azure-Funktionen
- Windows Presentation Foundation (WPF) und Windows Forms
- Klassenbibliotheken und Konsolen-Apps
- .NET Native UWP
- Xamarin.Forms und .NET MAUI
Die unterstützten Upgrade-Pfade umfassen:
- .NET Framework zu .NET
- .NET Core zu .NET
- UWP zu WinUI 3
- Ältere .NET-Versionen auf die neueste Version
- Azure Functions v1-v3 auf v4 (isoliert)
- Xamarin.Forms zu .NET MAUI (Hinweis: für XAML-Dateitransformationen wird nur das Upgrade von Namespaces unterstützt)
Dabei ist aus Praxiserfahrungen festzustellen, dass diese Projekttypen und die zugehörigen Upgrade-Pfade mit einem unterschiedlichen Grad, einer verschiedenen Detaillierung und damit letztendlich auch mit wechselndem Erfolg unterstützt werden.
Installation
Die Installation des .NET-Upgrade-Assistenten kann auf zwei Arten erfolgen: als Visual-Studio-Erweiterung (Extension) oder als globales .NET-Tool. Die Extension finden Sie unter der Bezeichnung Upgrade Assistant. Der Assistent kann direkt aus Visual Studio über das Kontextmenü im Projektmappen-Explorer aufgerufen werden. Um es als globales .NET-Tool zu installieren sind die folgenden Schritte notwendig:
- NET SDK überprüfen: Stellen Sie sicher, dass das .NET SDK auf Ihrem Computer installiert ist. Sie können das überprüfen, indem Sie in der Konsole den Befehl dotnet –version ausführen.
- Upgrade Assistant installieren: Öffnen Sie eine Konsole (Command Prompt, PowerShell) und führen Sie den folgenden Befehl aus dotnet tool install -g upgrade-assistant.
- Update: Da der .NET-Upgrade-Assistent als .NET-Tool installiert ist, kann er mittels dotnet tool update -g upgrade-assistant aktualisiert werden.
- Migrieren: Um ein Projekt zu aktualisieren, können Sie den Upgrade-Assistenten wie folgt verwenden: upgrade-assistant upgrade <Projektdatei oder Lösung>.
SIE LIEBEN .NET?
Entdecken Sie die BASTA! Tracks
Arbeitsweise und Tests
Wir demonstrieren das Handling mit dem .NET-Upgrade-Assistenten anhand einiger Projekte. Unser erstes Projekt ist eine ältere Windows-Forms-Applikation („Bibliothek“) auf der Basis des .NET Framework 4.7.2. Diese enthält lediglich ein Projekt und keine Abhängigkeiten von externen Bibliotheken. Die Benutzeroberfläche enthält nur wenige Komponenten, Herzstück ist ein DataGrid. Die Businesslogik ist im Code-Behind implementiert. Das Ziel ist eine Migration nach .NET 8, um die Applikation weiterentwickeln zu können. Starten wir mit einer ersten Analyse: Wir öffnen das Projekt in der aktuellen Version von Visual Studio und starten auf Ebene der Projektmappe (Kontextmenü im Projektmappen-Explorer) den .NET-Upgrade-Assistenten (Abb. 1).
Abb. 1: Start des .NET-Upgrade-Assistenten aus Visual Studio
Wir starten einen Report und müssen in den nachfolgenden Schritten das betreffende Projekt, das Ziel (hier .NET 8) und den Umfang der späteren Migration auswählen (Abb. 2).
Abb. 2: Konfigurieren der Migration im .NET-Upgrade-Assistenten
Das Ergebnis (Abb. 3) ist ein Report über die Einschätzung des Vorhabens und der notwendigen Schritte.
Abb. 3: Analyseergebnis der geplanten Migration
Die Hinweise stimmen uns optimistisch. Auf Projektebene starten wir danach den .NET-Upgrade-Assistenten neu und führen die konkrete Migration durch. Dabei haben wir u. a. die Wahl, ob wir die Migration innerhalb des Projekts durchführen möchten (in-place project upgrade) oder ob das migrierte Projekt als neues Projekt angelegt werden soll (side-by side project upgrade). Die eigentliche Migration des Projektes erfolgt ohne unser Zutun und konnte erfolgreich abgeschlossen werden. Die Windows-Forms-Applikation wurde nach .NET 8 portiert und kann auch gestartet und ausgeführt werden (Abb. 4).
Abb. 4: Der .NET-Upgrade-Assistent zeigt die erfolgreiche Migration
Das hat sehr gut funktioniert. Wie bereits dargestellt, handelt es sich um ein Projekt mit einem begrenzten Funktionsumfang und wenig Komplexität.
Unser zweiter Test ist schon anspruchsvoller. Es geht um eine Xamarin.Forms-Applikation für Android und iOS. Diese soll nach .NET MAUI migriert werden. Wir laden auch dieses Projekt in Visual Studio. Als Erstes werden wir aufgefordert, die fehlenden Komponenten für die Entwicklung von Xamarin.Forms-Projekte in Visual Studio nachzuladen. Diese wurden schon mit den Updates von Visual Studio entfernt, da auf dem Entwicklungsrechner in letzter Zeit nur noch .NET-MAUI-Projekte entwickelt wurden. Das Projekt weist auch Abhängigkeiten zu einigen externen Bibliotheken auf. Die Analyse der bevorstehenden Migration ergibt ein deutlich gemischteres Bild. Es werden Fehler und Schwierigkeiten bei der Migration erwartet und der Gesamtaufwand wird deutlich größer (24 Story Points) eingeschätzt (Abb. 5).
Abb. 5: Analyse des Xamarin-Projekts durch den .NET-Upgrade-Assistenten
Im nächsten Schritt starten wir die automatische Migration der Xamarin.Forms-App. Es muss jedes Xamarin.Forms-Projekt eigenständig über den .NET-Upgrade-Assistenten migriert werden. Die Migration des plattformneutralen Projektes konnte ohne Fehlermeldungen abgeschlossen werden. Die Migration des Android-Projekts dauerte einige Minuten und auch hier werden keine schwerwiegenden Fehler gemeldet. Als Letztes wird versucht, das iOS-Projekt zu migrieren. Wir bekommen Hinweise, dass ein Plug-in in iOS (zum Einblenden der Tastatur ist es in .NET MAUI nicht mehr erforderlich) nicht in .NET MAUI unterstützt wird. Ansonsten sieht das Ergebnis des Migrationsreports gut aus. Die App lässt sich dennoch nicht unmittelbar fehlerfrei kompilieren. Es werden Mehrdeutigkeiten von Klassen gemeldet. Das rührt daher, dass .NET MAUI auch neue Klassen einführt, die es in Xamarin nicht gab. Hier steht einige manuelle Nacharbeit auf der Agenda. Die Migration von Xamarin auf .NET MAUI ist deutlich komplexer als ein Update der .NET-Version. Dennoch liefert der .NET-Upgrade-Assistent wichtige Hinweise für eine Migration und nimmt auch bereits einige Arbeitsschritte vor.
Unser letztes Experiment versucht, eine Migration einer App für die UWP, bestehend aus mehreren Teilprojekten und der Nutzung von externen Bibliotheken. Starten wir auch hier mit einer Analyse der geplanten Migration: Das Ziel der Migration ist es, die App von der UWP (WinUI 2.*) nach WinUI 3 zu bekommen. Es deuten sich Probleme bei der Nutzung von Drittanbieterbibliotheken an. Die Analyse dauert mehrere Minuten und das Ergebnis enthält Hinweise zu erwarteten Aufgaben der Migration und möglichen Probleme. Hier wird beispielsweise bemängelt, dass eine externe Bibliothek für Interaktion mit dem Cloudspeicherdienst Dropbox nicht mit den neuen .NET-Versionen kompatibel ist. Wir wissen jedoch aus der Praxis, dass diese Bibliothek sowohl mit der UWP als auch mit WinUI 3 funktioniert. Gleiches gilt auch für andere gemeldete voraussichtliche Probleme. Der geschätzte riesige Migrationsaufwand (> 1 600 Story Points), primär durch das mögliche Neuschreiben der Bibliotheken, hat sich in der Praxis nicht so herausgestellt. Die App konnte mit einem deutlich geringeren Aufwand von der UWP nach WinUI 3 migriert werden. Das bedeutet, dass die Schätzung des .NET-Upgrade-Assistenten nur eine grobe Einschätzung des Aufwandes ist, sie kann auch komplett falsch sein. Wertvoller sind die Hinweise zu den konkreten Migrationsschritten.
ZUM NEWSLETTER
Regelmäßig News zur Konferenz und der .NET-Community
Stärken, Schwächen und Einschätzung
Der .NET-Upgrade-Assistent wird in der Entwicklercommunity als ein nützliches Werkzeug zur Modernisierung von .NET-Anwendungen angesehen, insbesondere für Projekte, die auf älteren .NET-Framework- oder .NET-Core-Versionen basieren. Das Tool ist wertvoll, weil es den Migrationsprozess durch Automatisierung und eine geführte Schritt-für-Schritt-Anleitung erheblich vereinfacht. Das hilft, typische Fehler zu vermeiden und den Prozess effizienter zu gestalten, insbesondere bei weniger komplexen Projekten. Man kann folgende Stärken ausmachen:
- Automatisierung: Das Tool automatisiert viele Aufgaben, die sonst manuell erledigt werden müssten, wie z. B. die Aktualisierung von Projektdateien und die Verwaltung von Abhängigkeiten. Das reduziert den Arbeitsaufwand und minimiert das Risiko von Fehlern.
- Vielfältige Unterstützung: Der Assistent unterstützt eine breite Palette von Projekttypen, darunter ASP.NET, WPF, Windows Forms und Xamarin.Forms und bietet auch Migrationspfade zu .NET MAUI und Azure Functions.
- Geführter Prozess: Entwickler:innen wird ein strukturierter Migrationspfad geboten, der sie durch jeden Schritt des Prozesses führt. Das Tool hebt potenzielle Probleme hervor und bietet Lösungen an, was besonders für weniger erfahrene Entwickler:innen hilfreich ist.
Das Tool ist primär eine Hilfestellung, d. h., es hat Schwächen und Einschränkungen:
- Komplexe Projekte: Bei sehr großen und komplexen Projekten kann das Tool an seine Grenzen stoßen und erfordert meist manuelle Nacharbeiten, da es nicht immer alle Probleme erkennt oder die optimalen Lösungen vorschlägt.
- Manuelle Eingriffe: Trotz der Automatisierung bleibt bei der Migration noch immer viel manuelle Arbeit erforderlich, insbesondere wenn es Änderungen an den Architekturentscheidungen gibt oder veraltete Bibliotheken nicht automatisch aktualisiert werden können.
Das Tool wird bisher kontinuierlich verbessert und unterstützt inzwischen auch neuere Technologien wie .NET MAUI und Azure Functions. Diese Erweiterungen und die Verbesserung der Fehlerbehandlung tragen dazu bei, die Qualität der automatischen Upgrades weiter zu erhöhen.
Migrationsplanung
Von einfachen Anpassungsmaßnahmen (Upgrade-Pfaden) abgesehen, beispielsweise eine Umstellung von einer älteren auf eine aktuelle .NET-Version, benötigt man eine gute Planung der Durchführung einer Migration. Wir beschreiben nachfolgend drei typische Migrationspfade im .NET-Umfeld. Die Migrationsplanung für .NET-Anwendungen umfasst typischerweise die Schritte (grober Ablauf) gemäß Tabelle 1.
Schritt/Phase (Meilenstein) | Teilschritte |
Vorbereitungsphase |
|
Planungsphase |
|
Durchführung der Migration |
|
Test- und Optimierungsphase |
|
Abschluss und Bereitstellung |
|
Nachbereitung |
|
Tabelle 1: Schrittfolge bei der Migration von .NET-basierten Anwendungen
Die Migration einer .NET-Anwendung ist ein anspruchsvoller Prozess, der eine sorgfältige Planung und Durchführung erfordert. Mit einer strukturierten Herangehensweise und der Nutzung des .NET-Upgrade-Assistenten kann der Übergang jedoch risikoarm gestaltet werden.
Migration von Xamarin.Forms nach .NET MAUI
Xamarin.Forms ist eine bewährte Plattform zur Erstellung plattformübergreifender mobiler Anwendungen mit einer gemeinsamen Codebasis für Android, iOS und UWP. Mit der Einführung von .NET MAUI (Multi-Platform-App-UI) hat Microsoft eine Weiterentwicklung und Erweiterung von Xamarin.Forms bereitgestellt, die zusätzlich die Entwicklung für macOS und Windows unterstützt und eine konsolidierte Entwicklungsplattform innerhalb von .NET darstellt. Sollen bestehende Xamarin.Forms-Apps weiter angepasst und entwickelt werden, sind diese zu .NET MAUI zu migrieren. Der typische Migrationspfad sieht wie folgt aus (Meilensteine):
- Schritt 1 – Aktualisieren: Aktualisieren Sie das Xamarin.Forms-Projekt auf die neueste Version, um sicherzustellen, dass alle Abhängigkeiten aktuell sind.
- Schritt 2 – Konvertieren: Konvertieren Sie das Projekt in ein .NET-MAUI-Projekt, was die Anpassung der Projektdateien (.csproj) erfordert.
- Schritt 3 – Prüfen: Überprüfen und aktualisieren Sie die XAML-Dateien und den Code auf Kompatibilität mit .NET MAUI. Das schließt auch die Migration von benutzerdefinierten Renderern und Abhängigkeiten ein.
- Schritt 4 – Tests: Führen Sie umfassende Tests durch, um sicherzustellen, dass die Anwendung auf allen Zielplattformen ordnungsgemäß funktioniert.
- Schritt 5 – Anpassungen: Durchführen von notwendigen Anpassungen, beispielsweise Bibliotheken, die unter neueren .NET-MAUI-Versionen nicht mehr unterstützt werden.
Neben der Möglichkeit das Projekt weiter entwickeln zu können, ergeben sich weitere Vorteile, beispielsweise eine vereinfachte Projektstruktur, eine bessere Entwicklungsunterstützung, erweiterte Plattformunterstützung (einschließlich Desktopplattformen) und eine verbesserte Performance und API-Konsistenz innerhalb des .NET-Ökosystems.
Migration von WPF zu WinUI 3
Windows Presentation Foundation (WPF) ist ein bewährtes Framework zur Entwicklung von Desktopanwendungen unter Windows. Es bietet eine flexible und leistungsstarke Plattform für die Gestaltung von Benutzeroberflächen. WinUI 3 hingegen ist das neueste UI-Framework von Microsoft, das moderne Windows-10- und Windows-11-Anwendungen mit einer modernen Benutzeroberflächentechnologie ermöglicht. Die Migration von WPF zu WinUI 3 kann eine sinnvolle Option sein, wenn Sie eine modernere, zukunftssichere Oberfläche für Ihre Anwendung entwickeln möchten. Ein typischer Migrationspfad kann wie folgt aussehen:
- Schritt 1 – Bewertung der Anwendung: Beginnen Sie mit einer gründlichen Analyse der bestehenden WPF-Anwendung, um zu verstehen, welche Teile problemlos migriert werden können und welche möglicherweise neu entwickelt werden müssen. Überprüfen Sie, welche externen Bibliotheken und Abhängigkeiten verwendet werden und ob diese in WinUI 3 unterstützt werden oder ersetzt werden müssen.
- Schritt 2 – Erstellen eines neuen WinUI-3-Projekts: Erstellen Sie ein neues WinUI-3-Projekt in Visual Studio. Dies stellt die Grundlage für die Migration Ihrer bestehenden WPF-Komponenten dar. Die Geschäftslogik (Backend-Code) aus der WPF-Anwendung kann in den meisten Fällen direkt übernommen werden, da WinUI 3 auf derselben .NET-Plattform basiert. Der Fokus liegt daher auf der Migration der Benutzeroberfläche.
- Schritt 3 – Migration der Benutzeroberfläche: WPF und WinUI 3 verwenden beide XAML zur Definition der Benutzeroberfläche, aber es gibt Unterschiede in den verfügbaren Steuerelementen und den unterstützten Features. Die XAML-Dateien müssen angepasst werden, um mit den WinUI-3-Komponenten kompatibel zu sein. Einige WPF-spezifische Funktionen wie bestimmte Steuerelemente oder Datenbindungskonzepte müssen durch die entsprechenden WinUI-3-Features ersetzt werden. Hier kann es notwendig sein, benutzerdefinierte Steuerelemente oder Workarounds zu implementieren.
- Schritt 4 – Testen und Optimieren: Testen Sie die migrierte Anwendung umfassend, um sicherzustellen, dass alle UI-Komponenten wie erwartet funktionieren. Achten Sie dabei besonders auf die Performance und das Verhalten der Benutzeroberfläche. Nehmen Sie nach Bedarf Optimierungen vor, insbesondere in Bezug auf die Nutzung neuerer WinUI-3-Features, die in WPF nicht verfügbar waren.
- Schritt 5 – Bereitstellung: Bereiten Sie die migrierte Anwendung für die Bereitstellung vor. WinUI 3 ermöglicht es, die Anwendung sowohl über den Microsoft Store als auch als klassische Desktopanwendung zu verteilen.
Welche Vorteile bietet eine Migration zu WinUI 3? WinUI 3 unterstützt das Fluent-Design-System, das moderne und ansprechende Benutzeroberflächen ermöglicht. Ebenso ist WinUI 3 die Basis für zukünftige Windows-Entwicklungen, was die Anwendung langfristig wartbar und kompatibel mit neuen Windows-Versionen macht. Es gibt eine bessere Unterstützung und Integration mit den neuesten Windows APIs, was die Nutzung neuerer Betriebssystemfeatures erleichtert. Bei größeren Projekten kann man jedoch von einem umfangreicheren Anpassungsbedarf ausgehen. Die Migration der Benutzeroberfläche kann erheblichen Anpassungsaufwand erfordern, insbesondere bei komplexen WPF-Anwendungen. Einige WPF-Features haben keine direkten Entsprechungen in WinUI 3, was möglicherweise Neuentwicklungen erforderlich macht. Zusammengefasst kann man sagen: Die Migration von WPF zu WinUI 3 ist ein strategischer Schritt, der insbesondere dann sinnvoll ist, wenn eine langfristige Modernisierung und Integration mit den neuesten Windows-Technologien angestrebt wird.
Anmerkung/Hinweis: Microsoft hat erkannt, dass WPF weiterhin eine große Bedeutung für bestehende Projekte (und vielleicht auch noch für neue Projekte) hat. Es sind daher auch Anpassungen und Aktualisierungen geplant. Die Roadmap [2] zu WPF sieht dazu beispielsweise wie folgt aus: „Im letzten Jahr haben wir uns bemüht, die Testinfrastruktur zu verbessern, Community-PRs zusammenzuführen, um seit langem bestehende Probleme zu beheben, neue Steuerelemente hinzuzufügen (OpenFolderDialog) und neue Funktionen zu ermöglichen (Hardwarebeschleunigung für RDP-Verbindungen). Die Bemühungen, unsere Tests als Open Source bereitzustellen und den Testprozess durch CI/CD-Pipelines zu automatisieren, Komponententests hinzuzufügen, persistente Probleme zu beheben und neuere Steuerelemente hinzuzufügen, führten dazu, dass WPF auf .NET 8 integriert wurde“. Ebenso werden die folgenden Features, beispielsweise mit .NET in Aussicht gestellt:
- Integration von Win-11-Features wie Andocklayout, abgerundete Ecken für Steuerelemente und neueres Farbschema
- Nullability Annotations zur Verbesserung der Codequalität
- Verbesserungen der Barrierefreiheit für WPF-Steuerelemente
- Optimierung von WPF für verbesserte Unterstützung auf allen Geräten
Daraus kann man schlussfolgern, dass WPF kurzfristig wohl nicht abgekündigt wird und daher eine Migration nach WinUI 3 aus heutiger Sicht nicht zwingend ist. Wichtiger ist es jedoch bestehende WPF-Anwendungen auf der Basis des .NET Frameworks (bis Version 4.8*) nach .NET zu portieren – womit wir direkt bei der Beschreibung des nächsten Migrationspfads sind.
Migration von .NET Framework zu .NET
Das .NET Framework ist eine ältere, aber weit verbreitete Plattform für die Entwicklung von Windows-Anwendungen. Es wurde bekanntermaßen durch .NET (früher .NET Core) abgelöst. Sollen bestehende Applikationen dauerhaft weiterentwickelt werden, muss man diese nach .NET migrieren. Die Schritte des typischen Migrationspfades sind:
- Schritt 1 – Analyse: Nutzen Sie den .NET-Upgrade-Assistenten, um die Kompatibilität Ihrer Anwendung zu prüfen und potenzielle Probleme zu identifizieren.
- Schritt 2 – Aktualisieren: Aktualisieren Sie NuGet-Pakete und Abhängigkeiten, um die Kompatibilität mit .NET sicherzustellen.
- Schritt 3 – Konvertieren: Konvertieren Sie das Projekt in ein SDK-Format und passen Sie die Projektdateien entsprechend an.
- Schritt 4 – Migrieren: Migrieren Sie schrittweise den Code, indem Sie veraltete APIs ersetzen und plattformübergreifende Features nutzen.
- Schritt 5 – Testen: Führen Sie umfassende Tests durch, um sicherzustellen, dass die Anwendung unter .NET korrekt funktioniert.
Durch die Migration – welche nicht immer einfach möglich ist – erreichen wir folgende Vorteile: eine plattformübergreifende Unterstützung (Windows, Linux, macOS), eine verbesserte Performance und Ressourcennutzung, den Zugang zu den neuesten .NET-Features und -Verbesserungen und eine langfristige Wartbarkeit der Applikation. Einen Überblick zu den aktuellen .NET-Versionen und deren Vorversionen gibt Tabelle 2. .NET 9 wird voraussichtlich im November 2024 erscheinen und .NET 10 ist für 2025 geplant.
Version | Veröffentlichungs-datum | Letzte Patch-Version | Patch-Datum | Release-Typ | Support-Ende |
.NET 8 | 14. November 2023 | 8.0.8 | 13. August 2024 | LTS | 10. November 2026 |
.NET 7 | 8. November 2022 | 7.0.20 | 28. Mai 2024 | STS | 14. Mai 2024 |
.NET 6 | 8. November 2021 | 6.0.33 | 13. August 2024 | LTS | 12. November 2024 |
.NET 5 | 10. November 2020 | 5.0.17 | 10. Mai 2022 | STS | 10. Mai 2022 |
Tabelle 2: .NET-Versionen (LTS = Long Term Support, STS = Standard Term Support)
ZUM NEWSLETTER
Regelmäßig News zur Konferenz und der .NET-Community
Fazit und Ausblick
Insgesamt bietet der NET-Upgrade-Assistent eine solide Grundlage für die Modernisierung von .NET-Anwendungen, besonders für kleinere bis mittelgroße Projekte. Bei größeren Projekten kann es ein Hilfsmittel sein, um den Anpassungsbedarf der Migration abzuschätzen. Hier muss i. d. R. eine umfassende Planung je nach Ausgangspunkt und Ziel des Upgrades durchgeführt werden. Schnelle und unkomplizierte Hilfe kann es für das eine oder andere .NET-Projekt bereitstellen, wenn man dieses beispielsweise im Zuge des laufenden Entwicklungsprojektes auf die aktuelle .NET-Version bringen möchte. Die Migration per Mausklick ist auch im .NET-Umfeld nur in Einzelfällen machbar.
Web: https://larinet.com, https://www.tech-punkt.com.