Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dies ist der erste Teil eines Lernprogramms, das veranschaulicht, wie Sie eine Beispiel-WPF-Desktop-App mit dem Namen Contoso Expenses modernisieren. Eine Übersicht über das Lernprogramm, die Voraussetzungen und Anweisungen zum Herunterladen der Beispiel-App finden Sie im Lernprogramm: Modernisieren einer WPF-App.
In diesem Teil der Anleitung migrieren Sie die gesamte App Contoso Expenses vom .NET Framework 4.7.2 zu .NET Core 3. Bevor Sie diesen Teil des Lernprogramms starten, stellen Sie sicher, dass Sie das ContosoExpenses-Beispiel in Visual Studio 2019 öffnen und erstellen.
Hinweis
Weitere Informationen zum Migrieren einer WPF-Anwendung von .NET Framework zu .NET Core 3 finden Sie in dieser Blogreihe.
Migrieren des ContosoExpenses-Projekts zu .NET Core 3
In diesem Abschnitt migrieren Sie das ContosoExpenses-Projekt in der Contoso Expenses-App zu .NET Core 3. Dazu erstellen Sie eine neue Projektdatei, die dieselben Dateien wie das vorhandene ContosoExpenses-Projekt enthält, aber auf .NET Core 3 anstelle von .NET Framework 4.7.2 ausgerichtet ist. Auf diese Weise können Sie eine einzelne Lösung mit .NET Framework- und .NET Core-Versionen der App verwalten.
Stellen Sie sicher, dass das ContosoExpenses-Projekt derzeit auf .NET Framework 4.7.2 ausgerichtet ist. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das ContosoExpenses Projekt, wählen Sie Eigenschaftenaus, und stellen Sie sicher, dass die Eigenschaft Zielframework auf der Registerkarte Anwendung auf .NET Framework 4.7.2 festgelegt ist.
Navigieren Sie im Windows-Explorer zum C:\WinAppsModernizationWorkshop\Lab\Übung1\01-Start\ContosoExpenses Ordner, und erstellen Sie eine neue Textdatei namens ContosoExpenses.Core.csproj.
Klicken Sie mit der rechten Maustaste auf die Datei, wählen Sie Mitöffnen aus, und öffnen Sie sie dann in einem Text-Editor Ihrer Wahl, z. B. Editor, Visual Studio Code oder Visual Studio.
Kopieren Sie den folgenden Text in die Datei, und speichern Sie ihn.
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>Schließen Sie die Datei, und kehren Sie zu der ContosoExpenses Solution in Visual Studio zurück.
Klicken Sie mit der rechten Maustaste auf die ContosoExpenses Lösung, und wählen Sie Hinzufügen –> Vorhandenes Projektaus. Wählen Sie die ContosoExpenses.Core.csproj Datei aus, die Sie soeben im Ordner
C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenseserstellt haben, um sie der Lösung hinzuzufügen.
Die ContosoExpenses.Core.csproj enthält die folgenden Elemente:
- Das Project-Element gibt eine SDK-Version von Microsoft.NET.Sdk.WindowsDesktopan. Dies bezieht sich auf .NET-Anwendungen für Windows Desktop und enthält Komponenten für WPF- und Windows Forms-Apps.
- Das PropertyGroup--Element enthält untergeordnete Elemente, die angeben, dass die Projektausgabe eine ausführbare Datei (keine DLL) ist, auf .NET Core 3 ausgerichtet ist und WPF verwendet. Für eine Windows Forms-App würden Sie anstelle des UseWPF--Elements ein UseWinForms--Element verwenden.
Hinweis
Beim Arbeiten mit dem .csproj-Format, das mit .NET Core 3.0 eingeführt wurde, werden alle Dateien im selben Ordner wie .csproj als Teil des Projekts betrachtet. Daher müssen Sie nicht jede Datei angeben, die im Projekt enthalten ist. Sie müssen nur die Dateien angeben, für die Sie entweder eine benutzerdefinierte Buildaktion definieren oder die Sie ausschließen möchten.
Migrieren des ContosoExpenses.Data-Projekts zu .NET Standard
Die ContosoExpenses Lösung enthält eine ContosoExpenses.Data- Klassenbibliothek, die Modelle und Schnittstellen für Dienste enthält und auf .NET 4.7.2 abzielt. .NET Core 3.0-Apps können .NET Framework-Bibliotheken verwenden, sofern sie keine APIs verwenden, die in .NET Core nicht verfügbar sind. Der beste Modernisierungspfad besteht jedoch darin, Ihre Bibliotheken in .NET Standard zu verschieben. Dadurch wird sichergestellt, dass Ihre Bibliothek vollständig von Ihrer .NET Core 3.0-App unterstützt wird. Darüber hinaus können Sie die Bibliothek auch mit anderen Plattformen wie web (über ASP.NET Core) wiederverwenden.
So migrieren Sie das projekt ContosoExpenses.Data zu .NET Standard:
Klicken Sie in Visual Studio mit der rechten Maustaste auf das ContosoExpenses.Data- Projekt, und wählen Sie Projekt entladenaus. Klicken Sie erneut mit der rechten Maustaste auf das Projekt, und wählen Sie dann "ContosoExpenses.Data.csprojbearbeiten" aus.
Löschen Sie den gesamten Inhalt der Projektdatei.
Kopieren Sie das folgende XML, fügen Sie es ein und speichern Sie die Datei.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> </Project>Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Data und wählen Sie Projekt neu ladenaus.
Konfigurieren von NuGet-Paketen und Abhängigkeiten
Wenn Sie die ContosoExpenses.Core und ContosoExpenses.Data Projekte in den vorherigen Abschnitten migriert haben, haben Sie die NuGet-Paketverweise aus den Projekten entfernt. In diesem Abschnitt fügen Sie diese Verweise wieder hinzu.
So konfigurieren Sie NuGet-Pakete für das ContosoExpenses.Data Projekt:
Erweitern Sie im Projekt ContosoExpenses.Data den Knoten Abhängigkeiten. Beachten Sie, dass der NuGet Abschnitt fehlt.
Wenn Sie die Packages.config im Projektmappen-Explorer öffnen finden Sie die "alten" Verweise der NuGet-Pakete, die das Projekt bei Verwendung des vollständigen .NET Framework verwendet haben.
Dies ist der Inhalt der Packages.config Datei. Sie werden feststellen, dass alle NuGet-Pakete auf das vollständige .NET Framework 4.7.2 abzielen:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Bogus" version="26.0.2" targetFramework="net472" /> <package id="LiteDB" version="4.1.4" targetFramework="net472" /> </packages>Löschen Sie im Projekt ContosoExpenses.Data die datei Packages.config.
Klicken Sie im ContosoExpenses.Data Projekt mit der rechten Maustaste auf den Knoten Abhängigkeiten, und wählen Sie NuGet-Pakete verwaltenaus.
Klicken Sie im Fenster NuGet-Paket-Manager auf Durchsuchen. Suchen Sie nach dem
Bogus-Paket, und installieren Sie die neueste stabile Version.
Suchen Sie nach dem
LiteDB-Paket, und installieren Sie die neueste stabile Version.
Möglicherweise fragen Sie sich, wo diese Liste von NuGet-Paketen gespeichert ist, da das Projekt keine packages.config Datei mehr hat. Die referenzierten NuGet-Pakete werden direkt in der CSPROJ-Datei gespeichert. Sie können dies überprüfen, indem Sie den Inhalt der ContosoExpenses.Data.csproj Projektdatei in einem Text-Editor anzeigen. Am Ende der Datei werden die folgenden Zeilen hinzugefügt:
<ItemGroup> <PackageReference Include="Bogus" Version="26.0.2" /> <PackageReference Include="LiteDB" Version="4.1.4" /> </ItemGroup>Hinweis
Möglicherweise stellen Sie auch fest, dass Sie dieselben Pakete für dieses .NET Core 3-Projekt wie die pakete installieren, die von .NET Framework 4.7.2-Projekten verwendet werden. NuGet-Pakete unterstützen Multitargeting. Bibliotheksautoren können verschiedene Versionen einer Bibliothek im selben Paket enthalten, kompiliert für unterschiedliche Architekturen und Plattformen. Diese Pakete unterstützen das vollständige .NET Framework sowie .NET Standard 2.0, das mit .NET Core 3-Projekten kompatibel ist. Weitere Informationen zu den Unterschieden zwischen .NET Framework, .NET Core und .NET Standard finden Sie unter .NET Standard.
So richten Sie die NuGet-Pakete für das Projekt ContosoExpenses.Core ein:
Öffnen Sie im Projekt ContosoExpenses.Core die datei packages.config. Beachten Sie, dass sie derzeit die folgenden Verweise enthält, die auf .NET Framework 4.7.2 abzielen.
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="CommonServiceLocator" version="2.0.2" targetFramework="net472" /> <package id="MvvmLightLibs" version="5.4.1.1" targetFramework="net472" /> <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" /> <package id="Unity" version="5.10.2" targetFramework="net472" /> </packages>In den folgenden Schritten verwenden Sie die .NET-Standardversionen der Pakete
MvvmLightLibsundUnity. Die anderen beiden Abhängigkeiten werden automatisch von NuGet heruntergeladen, wenn Sie diese beiden Bibliotheken installieren.Löschen Sie im Projekt ContosoExpenses.Core die Packages.config Datei.
Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Core, und wählen Sie NuGet-Pakete verwaltenaus.
Klicken Sie im Fenster NuGet-Paket-Manager auf Durchsuchen. Suchen Sie nach dem
Unity-Paket, und installieren Sie die neueste stabile Version.
Suchen Sie nach dem
MvvmLightLibsStd10-Paket, und installieren Sie die neueste stabile Version. Dies ist die .NET Standard-Version desMvvmLightLibs-Pakets. Für dieses Paket hat der Autor die .NET Standard-Version der Bibliothek in einem separaten Paket als die .NET Framework-Version verpackt.
Klicken Sie im Projekt ContosoExpenses.Core mit der rechten Maustaste auf den Knoten Abhängigkeiten, und wählen Sie Hinzufügen von Verweisaus.
Wählen Sie in der Kategorie Projekte > LösungContosoExpenses.Data aus, und klicken Sie auf OK.
Automatisch generierte Assemblyattribute deaktivieren
Wenn Sie an diesem Punkt des Migrationsprozesses versuchen, das ContosoExpenses.Core Projekt zu erstellen, werden einige Fehler angezeigt.
Dieses Problem tritt auf, da das mit .NET Core 3.0 eingeführte neue CSPROJ-Format die Assemblyinformationen in der Projektdatei und nicht in der AssemblyInfo.cs Datei speichert. Um diese Fehler zu beheben, deaktivieren Sie dieses Verhalten, und lassen Sie das Projekt weiterhin die AssemblyInfo.cs Datei verwenden.
Klicken Sie in Visual Studio mit der rechten Maustaste auf das projekt ContosoExpenses.Core, und wählen Sie Projekt entladenaus. Klicken Sie erneut mit der rechten Maustaste auf das Projekt, und wählen Sie dann "ContosoExpenses.Core.csprojbearbeiten" aus.
Fügen Sie das folgende Element im Abschnitt PropertyGroup hinzu, und speichern Sie die Datei.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>Nach dem Hinzufügen dieses Elements sollte der Abschnitt PropertyGroup- nun wie folgt aussehen:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Core und wählen Sie Projekt neu ladenaus.
Klicken Sie mit der rechten Maustaste auf das projekt ContosoExpenses.Data, und wählen Sie Projekt entladenaus. Klicken Sie erneut mit der rechten Maustaste auf das Projekt, und wählen Sie dann "ContosoExpenses.Data.csprojbearbeiten" aus.
Fügen Sie denselben Eintrag im Abschnitt PropertyGroup hinzu, und speichern Sie die Datei.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>Nach dem Hinzufügen dieses Elements sollte der Abschnitt PropertyGroup- nun wie folgt aussehen:
<PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Data und wählen Sie Projekt neu ladenaus.
Hinzufügen des Windows-Kompatibilitätspakets
Wenn Sie jetzt versuchen, die Projekte ContosoExpenses.Core und ContosoExpenses.Data zu kompilieren, werden Sie feststellen, dass die vorherigen Fehler jetzt behoben sind, aber es gibt weiterhin einige ähnliche Fehler in der Bibliothek ContosoExpenses.Data.
Services\RegistryService.cs(9,26,9,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,26,12,34): error CS0103: The name 'Registry' does not exist in the current context
Services\RegistryService.cs(12,97,12,123): error CS0103: The name 'RegistryKeyPermissionCheck' does not exist in the current context
Diese Fehler sind das Ergebnis der Konvertierung des ContosoExpenses.Data Projekts aus einer .NET Framework-Bibliothek (die für Windows spezifisch ist) in eine .NET Standard-Bibliothek, die auf mehreren Plattformen ausgeführt werden kann, einschließlich Linux, Android, iOS und mehr. Das ContosoExpenses.Data--Projekt enthält eine Klasse namens RegistryService-, die mit der Windows-Registrierung interagiert, ein Konzept, das nur unter Windows existiert.
Um diese Fehler zu beheben, installieren Sie das Windows-Kompatibilitätspaket NuGet.To resolve these errors, install the Windows Compatibility NuGet package. Dieses Paket bietet Unterstützung für viele windowsspezifische APIs, die in einer .NET Standard-Bibliothek verwendet werden können. Die Bibliothek wird nach der Verwendung dieses Pakets nicht mehr plattformübergreifend sein, aber sie wird weiterhin auf .NET Standard ausgerichtet.
Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Data.
Wählen Sie NuGet-Pakete verwaltenaus.
Klicken Sie im Fenster NuGet-Paket-Manager auf Durchsuchen. Suchen Sie nach dem
Microsoft.Windows.Compatibility-Paket, und installieren Sie die neueste stabile Version.
Versuchen Sie es nun erneut, das Projekt zu kompilieren, indem Sie mit der rechten Maustaste auf das ContosoExpenses.Data- Projekt klicken und Build-auswählen.
Dieses Mal wird der Buildprozess ohne Fehler abgeschlossen.
Testen und Debuggen der Migration
Nachdem die Projekte erfolgreich erstellt wurden, können Sie die App ausführen und testen, um festzustellen, ob Laufzeitfehler vorliegen.
Klicken Sie mit der rechten Maustaste auf das projekt ContosoExpenses.Core, und wählen Sie Als Startprojekt festlegenaus.
Drücken Sie F5, um das ContosoExpenses.Core Projekt im Debugger zu starten. Es wird eine Ausnahme ähnlich der folgenden angezeigt.
Diese Ausnahme wird ausgelöst, da beim Löschen des Inhalts aus der .csproj-Datei zu Beginn der Migration die Informationen zur Buildaktion für die Bilddateien entfernt wurden. Die folgenden Schritte beheben dieses Problem.
Beenden Sie den Debugger.
Klicken Sie mit der rechten Maustaste auf das projekt ContosoExpenses.Core, und wählen Sie Projekt entladenaus. Klicken Sie erneut mit der rechten Maustaste auf das Projekt, und wählen Sie dann "ContosoExpenses.Core.csprojbearbeiten" aus.
Fügen Sie vor dem schließenden Project-Element den folgenden Eintrag hinzu:
<ItemGroup> <Content Include="Images/*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Core und wählen Sie Projekt neu ladenaus.
Um die Contoso.ico der App zuzuweisen, klicken Sie mit der rechten Maustaste auf das ContosoExpenses.Core Projekt, und wählen Sie Eigenschaftenaus. Klicken Sie auf der geöffneten Seite im Feld Symbol auf das Dropdown-Menü und wählen Sie
Images\contoso.icoaus.
Klicken Sie auf Speichern.
Drücken Sie F5, um das ContosoExpenses.Core Projekt im Debugger zu starten. Vergewissern Sie sich, dass die App jetzt ausgeführt wird.
Nächste Schritte
An diesem Punkt im Lernprogramm haben Sie die Contoso Expenses-App erfolgreich zu .NET Core 3 migriert. Sie sind jetzt bereit für Teil 2: Hinzufügen eines UWP InkCanvas-Steuerelements mit XAML-Inseln.
Hinweis
Wenn Sie über einen Bildschirm mit hoher Auflösung verfügen, stellen Sie möglicherweise fest, dass die App sehr klein aussieht. Sie werden dieses Problem im nächsten Schritt des Lernprogramms beheben.
Windows developer