Leitfaden zum Portieren von Desktop-Apps

Der meiste Anwendungscode kann in einen der folgenden Bereiche unterteilt werden:

  • Code der Benutzeroberfläche (z. B. Fenster und Schaltflächen)
  • 3rd-Party-Steuerelemente (z. B. Diagramme)
  • Geschäftslogik (z. B. Validierungsregeln)
  • Lokaler Datenspeicher und Zugriff
  • Webdienste und Remotedatenzugriff

Für Windows Forms- und WPF-Anwendungen, die mit C# (oder Visual Basic.NET) geschrieben wurden, kann eine überraschende Menge der Geschäftslogik, des lokalen Datenzugriffs und des Webdienstcodes plattformübergreifend freigegeben werden.

.NET Portability Analyzer

Visual Studio 2017 und höher unterstützen den .NET Portability Analyzer (Download für Windows), der Ihre vorhandenen Anwendungen untersuchen und Ihnen mitteilen kann, wie viel Code "wie besehen" auf andere Plattformen portiert werden kann.

Es gibt auch ein Befehlszeilentool, das von Portability Analyzer auf GitHub heruntergeladen und verwendet werden kann, um dieselben Berichte bereitzustellen.

"x% meines Codes ist portabel. Wie geht es weiter?"

Hoffentlich zeigt das Analysetool, dass ein großer Teil Ihres Codes portabel ist, aber es wird sicherlich einige Teile jeder App geben, die nicht auf andere Plattformen verschoben werden können .

Verschiedene Codeblöcke werden wahrscheinlich in einen dieser Buckets fallen, die unten ausführlicher erläutert werden:

  • Wiederverwendebarer portabler Code
  • Code, der Änderungen erfordert
  • Code, der nicht portierbar ist und einen erneuten Schreibvorgang erfordert

Wiederverwendebarer portabler Code

.NET-Code, der für APIs geschrieben wird, die auf allen Plattformen verfügbar sind, kann plattformübergreifend unverändert verwendet werden. Im Idealfall können Sie all diesen Code in eine portable Klassenbibliothek, eine freigegebene Bibliothek oder eine .NET-Standardbibliothek verschieben und ihn dann in Ihrer vorhandenen App testen.

Diese freigegebene Bibliothek kann dann Anwendungsprojekten für andere Plattformen (z. B. Android, iOS, macOS) hinzugefügt werden.

Code, der Änderungen erfordert

Einige .NET-APIs sind möglicherweise nicht auf allen Plattformen verfügbar. Wenn diese APIs in Ihrem Code vorhanden sind, müssen Sie diese Abschnitte erneut schreiben, um plattformübergreifende APIs zu verwenden.

Beispiele hierfür sind die Verwendung von Reflexions-APIs, die in .NET 4.6 verfügbar sind, aber nicht auf allen Plattformen verfügbar sind.

Nachdem Sie den Code mit portablen APIs neu geschrieben haben, sollten Sie in der Lage sein, diesen Code in einer freigegebenen Bibliothek zu packen und in Ihrer vorhandenen App zu testen.

Code, der nicht portierbar ist und einen erneuten Schreibvorgang erfordert

Beispiele für Code, der wahrscheinlich nicht plattformübergreifend ist, sind:

  • Benutzeroberfläche: Windows Forms- oder WPF-Bildschirme können beispielsweise nicht in Projekten unter Android oder iOS verwendet werden. Ihre Benutzeroberfläche muss neu geschrieben werden, wobei dieser Steuerelementvergleich als Referenz verwendet wird.

  • Plattformspezifischer Speicher: Code, der auf einer plattformspezifischen Technologie (z. B. einer lokalen SQL Server Express Datenbank) basiert. Sie müssen dies mithilfe einer plattformübergreifenden Alternative (z. B. SQLite für die Datenbank-Engine) erneut schreiben. Einige Dateisystemvorgänge müssen möglicherweise auch angepasst werden, da UWP geringfügig unterschiedliche APIs zu Android und iOS aufweist (z. B. bei einigen Dateisystemen wird die Groß-/Kleinschreibung beachtet, andere nicht).

  • Drittanbieterkomponenten : Überprüfen Sie, ob Drittanbieterkomponenten in Ihren Anwendungen auf anderen Plattformen verfügbar sind. Einige, z. B. nicht visuelle NuGet-Pakete, sind möglicherweise verfügbar, aber andere (insbesondere visuelle Steuerelemente wie Diagramme oder Medienplayer).

Tipps zum Portieren von Code

  • Abhängigkeitsinjektion – Bereitstellen unterschiedlicher Implementierungen für jede Plattform und

  • Mehrschichtige Vorgehensweise – Ob MVVM, MVC, MVP oder ein anderes Muster, das Ihnen hilft, den portablen Code vom plattformspezifischen Code zu trennen.

  • Messaging : Sie können die Nachrichtenübergabe in Ihrem Code verwenden, um Interaktionen zwischen verschiedenen Teilen der Anwendung zu trennen.