Seit ich mit der Community zusammenarbeite, um Desktop-Anwendungen von .NET Framework auf .NET Core zu portieren, habe ich festgestellt, dass es zwei Gruppen von Leuten gibt: Einige möchten eine sehr einfache und kurze Liste von Anweisungen, auf die ihre Apps portiert werden sollen .NET Core, während andere einen prinzipielleren Ansatz mit mehr Hintergrundinformationen bevorzugen. Anstatt ein "Schweizer Taschenmesser" -Dokument zu verfassen, werden wir zwei Blog-Beiträge veröffentlichen, einen für jedes Camp:
- Dieser Beitrag ist der einfache Fall . Es konzentriert sich auf einfache Anweisungen und kleinere Anwendungen und ist der einfachste Weg, Ihre App auf .NET Core zu verschieben.
- Wir werden einen weiteren Beitrag für kompliziertere Fälle veröffentlichen . Dieser Beitrag konzentriert sich mehr auf nicht triviale Anwendungen, wie z. B. WPF-Anwendungen mit Abhängigkeiten von WCF- und UI-Paketen von Drittanbietern.
Wenn Sie lieber Videos als lesen möchten, finden Sie hier das Video, in dem ich alles mache, was unten beschrieben wird.
Schritt 0 - Voraussetzungen
Um Ihre Desktop-Apps auf Core zu portieren, benötigen Sie .NET Core 3 und Visual Studio 2019.
Schritt 1 - Führen Sie den Portabilitätsanalysator aus
Vor dem Portieren sollten Sie überprüfen, wie kompatibel Ihre Anwendung mit .NET Core ist. Laden Sie dazu .NET Portability Analyzer herunter und führen Sie es aus.
- Wenn Sie auf der ersten Registerkarte, Portabilitätsübersicht, nur 100% in der .NET Core-Spalte haben (alles ist grün hervorgehoben), ist Ihr Code vollständig kompatibel. Fahren Sie mit Schritt 2 fort.
- Wenn Sie Werte von weniger als 100% haben, sehen Sie sich zunächst alle Assemblys an, die nicht Teil Ihrer Anwendung sind. Überprüfen Sie für diese, ob ihre Autoren Versionen für .NET Core oder .NET Standard bereitstellen.
- Schauen Sie sich nun den anderen Teil der Assemblys an, die aus Ihrem Code stammen. Wenn im Portabilitätsbericht keine Ihrer Assemblys aufgeführt ist, fahren Sie mit Schritt 2 fort. Öffnen Sie in diesem Fall die Registerkarte Details, filtern Sie die Tabelle, indem Sie auf die Spalte Assembly klicken, und konzentrieren Sie sich nur auf diejenigen, die aus Ihrer Anwendung stammen. Gehen Sie die Liste durch und überarbeiten Sie Ihren Code, um die Verwendung der API zu beenden oder die API-Verwendung durch Alternativen aus .NET Core zu ersetzen.

Schritt 2 - Migrieren Sie zu .csproj im SDK-Stil
Klicken Sie im Projektmappen- Explorer mit der rechten Maustaste auf Ihr Projekt (nicht auf die Lösung!). Sehen Sie Projektdatei bearbeiten ? In diesem Fall 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 Ihr Projekt eine Datei
packages.config
enthält. Wenn Sie dies nicht tun, ist keine Aktion erforderlich. Wenn Sie dies tun, klicken Sie mit der rechten Maustaste auf packages.config
und wählen Sie Pakete.config nach PackageReference migrieren . Klicken Sie dann auf OK . - Öffnen Sie Ihre Projektdatei, indem Sie mit der rechten Maustaste auf das Projekt klicken und Projekt entladen wählen. Klicken Sie dann mit der rechten Maustaste auf das Projekt und wählen Sie <Ihr Projektname> .csproj bearbeiten .
- Kopieren Sie den Inhalt der Projektdatei beispielsweise in den Editor, damit Sie später danach suchen können.
- Löschen Sie alles aus Ihrer in Visual Studio geöffneten Projektdatei (ich weiß, dass es aggressiv klingt, aber wir werden nur den benötigten Inhalt aus der Kopie hinzufügen, die wir in wenigen Schritten erstellt haben). Fügen Sie anstelle des gerade gelöschten Texts den folgenden Code ein. Für eine WinForms-Anwendung:
<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
PackageReference
im Editor nach PackageReference
. Wenn Sie nichts gefunden haben, fahren Sie fort. Wenn Sie PackageReference
gefunden PackageReference
, kopieren Sie die gesamte <ItemGroup>
, die PackageReference
enthält, in Ihre in Visual Studio geöffnete Projektdatei direkt unter den Zeilen, die Sie im obigen Schritt eingefügt haben. Tun Sie dies für jedes Vorkommen der PackageReference
Sie gefunden haben. Der kopierte Block sollte so 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 gefunden haben, 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
<Project>
und <Name>
entfernen, da sie im neuen Projektdateistil nicht benötigt werden. Kopieren Sie für jede gefundene ProjectReference
(falls vorhanden) nur ItemGroup
und ProjectReference
wie ItemGroup
.
<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 den neuen SDK-Stil aktualisiert! Das Projekt zielt weiterhin auf .NET Framework ab, aber jetzt können Sie es erneut auf .NET Core ausrichten.
Schritt 3 - Retarget auf .NET Core
Öffnen Sie Ihre Projektdatei, indem Sie im Projektmappen- Explorer auf Ihr Projekt doppelklicken . Suchen Sie die Eigenschaft <TargetFramework>
und ändern Sie den Wert in netcoreapp3.0
. Jetzt sollte Ihre Projektdatei 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 auf .NET Core 3 portiert!
Fehler beheben
Wenn Sie Fehler wie erhalten
The type or namespace <some name> could not be found
oder
The name <some name> does not exist in the current context
und Ihr Portabilitätsbericht war grün. Es sollte einfach zu beheben sein, indem Sie ein NuGet-Paket mit der entsprechenden Bibliothek hinzufügen. Wenn Sie das NuGet-Paket mit der fehlenden Bibliothek nicht finden können, verweisen Sie auf Microsoft.Windows.Compatibility . Dieses Paket fügt ~ 21K .NET-APIs aus .NET Framework hinzu.
Mit Designern arbeiten
Obwohl es möglich ist, die Benutzeroberfläche Ihrer Anwendung über Code zu bearbeiten, bevorzugen Entwickler normalerweise die Verwendung der visuellen Designer. Mit .NET Core mussten wir die Art und Weise, wie die Designer mit .NET Core-Projekten arbeiten, neu gestalten:
- Der WPF-Designer befindet sich bereits in der Vorschau und wir arbeiten daran, ihm weitere Funktionen hinzuzufügen.
- Der WinForms-Designer für .NET Core wird später verfügbar sein. In der Zwischenzeit können Sie den WinForms-Designer von .NET Framework als Problemumgehung verwenden.
So können Sie den .NET Framework WinForms-Designer verwenden:
- Kopieren Sie Ihre .csproj-Datei (sagen wir, Sie haben
MyProject.csproj
), geben Sie ihr einen anderen Namen, z. B. MyProject.NetFramework.csproj
und MyProject.NetFramework.csproj
sie neben Ihre vorhandene Projektdatei ein. MyProject.NetFramework.csproj
Sie sicher, dass Ihr Projekt in Visual Studio geschlossen ist, und öffnen Sie das neue Projekt MyProject.NetFramework.csproj
.
Klicken Sie im Projektmappen- Explorer mit der rechten Maustaste auf Ihr Projekt und wählen Sie Eigenschaften . Setzen Sie auf der Registerkarte Anwendung (sollte standardmäßig geöffnet sein) den Namen der Baugruppe und den Standard-Namespace auf die gleichen Werte wie in Ihrem ursprünglichen Projekt (entfernen Sie ".NetFramework" aus den Namen).
Speichern Sie diese Lösung neben Ihrer vorhandenen Lösung.- Öffnen Sie die neue Projektdatei und ändern Sie das
<TargetFramework>
in net472
. - Wenn Sie jetzt den WinForms-Designer verwenden müssen, laden Sie Ihr Projekt mit der
MyProject.NetFramework.csproj
, und Sie erhalten die volle Erfahrung des .NET Framework-Designers. Wenn Sie mit dem Designer fertig sind, schließen Sie Ihr Projekt und öffnen Sie es mit der .NET Core-Projektdatei. - Dies ist nur eine Problemumgehung, bis der WinForms-Designer für .NET Core bereit ist.
Warum auf .NET Core portieren?
Schauen Sie sich das Video an, in dem Scott Hunter und ich über die neuen Funktionen der .NET Core 3- Portierung auf .NET Core 3.0 sprechen.