Portieren von Desktop-Anwendungen nach .NET Core

Seit ich mit der Community zusammenarbeite, um Desktop-Anwendungen von .NET Framework auf .NET Core zu portieren, habe ich festgestellt, dass es „zwei Lager“ gibt: Vertreter eines Lagers möchten eine sehr einfache und kurze Liste von Anweisungen zum Portieren ihrer Anwendungen auf .NET Core , während Vertreter eines anderen einen prinzipielleren Ansatz mit vielen anfänglichen Informationen bevorzugen. Anstatt ein Dokument wie das „Schweizer Taschenmesser“ zu schreiben, werden wir zwei Blog-Beiträge veröffentlichen, einen für jedes „Lager“:

  • Dieser Beitrag ist ein einfacher Fall . Es konzentriert sich auf einfache Anweisungen und kleine Anwendungen und bietet die einfachste Möglichkeit, eine Anwendung auf .NET Core zu portieren.
  • Später werden wir einen weiteren Beitrag für komplexere Fälle veröffentlichen . Der Schwerpunkt liegt auf nicht trivialen Anwendungen, z. B. einer WPF-Anwendung mit Abhängigkeiten von WCF- und UI-Paketen von Drittanbietern.

Wenn Sie lieber ein Video sehen als lesen möchten, dann ist hier ein Video, in dem ich alles mache, was unten beschrieben wird.


Schritt 0 - Voraussetzungen


Zum Übertragen von Desktopanwendungen auf Core benötigen Sie .NET Core 3 und Visual Studio 2019.

Schritt 1 - Starten Sie den Portability Analyzer


Vor dem Portieren sollten Sie überprüfen, wie kompatibel Ihre Anwendung mit .NET Core ist. Laden Sie dazu den .NET Portability Analyzer herunter und führen Sie ihn aus.

  • Wenn auf der ersten Registerkarte, Portabilitätszusammenfassung, alle Werte in der .NET Core-Spalte 100% sind (alles ist grün hervorgehoben), ist Ihr Code vollständig kompatibel und Sie können mit Schritt 2 fortfahren.
  • Wenn Sie Werte unter 100% haben, sehen Sie sich zunächst alle Assemblys an, die nicht Teil Ihrer Anwendung sind. Für sie müssen Sie überprüfen, ob ihre Autoren Versionen für .NET Core oder .NET Standard bereitstellen.
  • Schauen Sie sich nun den anderen Teil der Assemblys an, der aus Ihrem Code stammt. Wenn im Portabilitätsbericht keine Assemblys angegeben sind, fahren Sie mit Schritt 2 fort. Öffnen Sie anschließend die Registerkarte Details, filtern Sie die Tabelle, indem Sie auf die Spalte Assembly klicken, und konzentrieren Sie sich nur auf diejenigen, die sich auf Ihre Anwendung beziehen. Durchsuchen Sie die Liste und das Code-Refactoring, um die Verwendung der API zu beenden oder die Verwendung der API durch .NET Core-Alternativen zu ersetzen.

Bild

Schritt 2 - Migrieren von .csproj in den SDK-Stil


Klicken Sie im Projektmappen- Explorer mit der rechten Maustaste auf Ihr Projekt (keine Lösung!). Sehen Sie Projektdatei bearbeiten ? Wenn ja, verwenden Sie bereits die Projektdatei im SDK-Stil. Fahren Sie daher mit Schritt 3 fort . Wenn nicht, gehen Sie wie folgt vor:

  • Überprüfen Sie im Projektmappen- Explorer, ob das Projekt die Datei packages.config enthält. Ist dies nicht der Fall , ist keine Aktion erforderlich. Wenn dies der Fall ist, klicken Sie mit der rechten Maustaste auf packages.config und wählen Sie Pakete.config nach PackageReference migrieren aus . Klicken Sie dann auf OK .
  • Öffnen Sie die Projektdatei, indem Sie mit der rechten Maustaste auf das Projekt klicken und Projekt entladen auswählen. Klicken Sie dann mit der rechten Maustaste auf das Projekt und wählen Sie Bearbeiten <Ihr Projektname> .csproj .
  • Kopieren Sie den Inhalt der Projektdatei beispielsweise in den Editor, damit Sie ihn später durchsuchen können.
  • Löschen Sie alles aus der in Visual Studio geöffneten Projektdatei (ich weiß, dass dies aggressiv klingt, aber wir werden nur den erforderlichen Inhalt aus der Kopie hinzufügen, die wir gerade in wenigen Schritten erstellt haben). Fügen Sie statt nur gelöschten Text den folgenden Code ein.

    Für eine Anwendung auf WinForms:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project> 

    Für eine WPF-Anwendung:

     <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project> 
  • Suchen Sie nach Notepad PackageReference . Wenn Sie nichts gefunden haben, fahren Sie fort. Wenn Sie eine PackageReference finden , kopieren Sie die gesamte ItemGroup mit der PackageReference in die in Visual Studio geöffnete Projektdatei direkt unter den im obigen Schritt eingefügten Zeilen. Führen Sie dies für jedes gefundene PackageReference- Element aus. Der kopierte Block sollte folgendermaßen aussehen:

     <ItemGroup> <PackageReference Include="NUnit"> <Version>3.11.0</Version> </PackageReference> </ItemGroup> 
  • Machen Sie jetzt dasselbe wie oben für ProjectReference . Wenn Sie nichts gefunden haben, fahren Sie fort. Wenn Sie ProjectReference- Elemente finden, sehen diese folgendermaßen aus:

     <ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj"> <Project>{7bce0d50-17fe-4fda-b6b7-e7960aed8ac2}</Project> <Name>WindowsFormsApp1</Name> </ProjectReference> </ItemGroup> 
  • Sie können Zeilen mit den Eigenschaften Projekt und Name löschen, da sie im neuen Stil der Projektdatei nicht benötigt werden. Kopieren Sie für jede gefundene ProjectReference (falls vorhanden) nur die ItemGroup und die ProjectReference .

     <ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj" /> </ItemGroup> 
  • Speichern Sie alles. Schließen Sie die .csproj-Datei in Visual Studio. Klicken Sie im Projektmappen- Explorer mit der rechten Maustaste auf Ihr Projekt und wählen Sie Projekt neu laden . Erstellen Sie neu und stellen Sie sicher, dass keine Fehler vorliegen.

Tolle Neuigkeiten, Sie haben gerade Ihre Projektdatei auf einen neuen SDK-Stil aktualisiert! Das Projekt ist weiterhin auf .NET Framework ausgerichtet, aber jetzt können Sie es in .NET Core neu konfigurieren.

Schritt 3 - Retarget auf .NET Core


Öffnen Sie die Projektdatei, indem Sie im Projektmappen- Explorer darauf doppelklicken . Suchen Sie die TargetFramework- Eigenschaft und ändern Sie den Wert in netcoreapp3.0 . Ihre Projektdatei sollte nun folgendermaßen aussehen:

 <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> ... </PropertyGroup> ... </Project> 

Erstellen Sie Ihr Projekt und führen Sie es aus. Herzlichen Glückwunsch, Sie haben es auf .NET Core 3 migriert!

Fehlerbehebung


Wenn Sie auf Fehler stoßen wie

 The type or namespace <some name> could not be found 

oder

 The name <some name> does not exist in the current context 

Wenn Ihr Portabilitätsbericht grün angezeigt wird, sollten Sie wissen, dass sie leicht zu beheben sind, indem Sie einfach das NuGet-Paket mit der entsprechenden Bibliothek hinzufügen. Wenn Sie das NuGet-Paket mit der fehlenden Bibliothek nicht finden können, wenden Sie sich an Microsoft.Windows.Compatibility . Dieses Paket fügt eine ~ 21K .NET-API aus dem .NET Framework hinzu.

Arbeiten Sie mit Designern


Obwohl die Benutzeroberfläche der Anwendung mithilfe von Code bearbeitet werden kann, bevorzugen Entwickler normalerweise die Verwendung visueller Konstruktoren. Mit .NET Core mussten wir die Architektur der Arbeit von Designern mit .NET Core-Projekten ändern:

  • WPF Designer befindet sich bereits im Vorschaumodus und wir arbeiten daran, zusätzliche Funktionen hinzuzufügen.
  • WinForms Designer für .NET Core wird später verfügbar sein. Daher können Sie WinForms Designer für .NET Framework vorerst als Problemumgehung verwenden.

So verwenden Sie den WinForms-Konstruktor für .NET Framework:

  1. Kopieren Sie die .csproj-Datei (z. B. MyProject.csproj ), geben Sie ihr einen anderen Namen, z. B. MyProject.NetFramework.csproj, und platzieren Sie sie neben der vorhandenen Projektdatei.
  2. Stellen Sie sicher, dass Ihr Projekt in Visual Studio geschlossen ist, und öffnen Sie ein neues Projekt MyProject.NetFramework.csproj .
    Klicken Sie im Projektmappen- Explorer mit der rechten Maustaste auf Ihr Projekt und wählen Sie Eigenschaften . Stellen Sie auf der Registerkarte Anwendung (sollte standardmäßig geöffnet sein) den Namen der Assembly und den Standard-Namespace auf die gleichen Werte wie im ursprünglichen Projekt ein (entfernen Sie ".NetFramework" aus den Namen).
    Speichern Sie diese Lösung neben Ihrer vorhandenen Lösung.
  3. Öffnen Sie eine neue Projektdatei und ändern Sie TargetFramework in net472 .
  4. Nachdem Sie den WinForms-Konstruktor verwenden müssen, laden Sie Ihr Projekt von MyProject.NetFramework.csproj herunter, und Sie können mit dem .NET Framework-Konstruktor arbeiten. Wenn Sie damit fertig sind, schließen und öffnen Sie Ihr Projekt mit der .NET Core-Projektdatei.
  5. Dies ist nur eine Problemumgehung, bis der WinForms-Konstruktor für .NET Core bereit ist.

Warum zu .NET Core wechseln?


Sehen Sie sich ein Video an, in dem Scott Hunter und ich über die neuesten Updates für .NET Core 3 sprechen. Migration auf .NET Core 3.0 .

Source: https://habr.com/ru/post/de454508/


All Articles