Freigeben über


Teil 1: Migrieren der Contoso-Ausgaben-App zu .NET Core 3

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.

  1. 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.

    .NET Framework, Version 4.7.2 für das Projekt

  2. Navigieren Sie im Windows-Explorer zum C:\WinAppsModernizationWorkshop\Lab\Übung1\01-Start\ContosoExpenses Ordner, und erstellen Sie eine neue Textdatei namens ContosoExpenses.Core.csproj.

  3. 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.

  4. 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>
    
  5. Schließen Sie die Datei, und kehren Sie zu der ContosoExpenses Solution in Visual Studio zurück.

  6. 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\ContosoExpenses erstellt 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:

  1. 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.

  2. Löschen Sie den gesamten Inhalt der Projektdatei.

  3. 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>
    
  4. 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:

  1. Erweitern Sie im Projekt ContosoExpenses.Data den Knoten Abhängigkeiten. Beachten Sie, dass der NuGet Abschnitt fehlt.

    NuGet-Pakete

    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.

    Abhängigkeiten und Pakete

    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>
    
  2. Löschen Sie im Projekt ContosoExpenses.Data die datei Packages.config.

  3. Klicken Sie im ContosoExpenses.Data Projekt mit der rechten Maustaste auf den Knoten Abhängigkeiten, und wählen Sie NuGet-Pakete verwaltenaus.

NuGet-Pakete verwalten...

  1. Klicken Sie im Fenster NuGet-Paket-Manager auf Durchsuchen. Suchen Sie nach dem Bogus-Paket, und installieren Sie die neueste stabile Version.

    Bogus NuGet-Paket

  2. Suchen Sie nach dem LiteDB-Paket, und installieren Sie die neueste stabile Version.

    LiteDB NuGet-Paket

    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:

  1. Ö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 MvvmLightLibs und Unity. Die anderen beiden Abhängigkeiten werden automatisch von NuGet heruntergeladen, wenn Sie diese beiden Bibliotheken installieren.

  2. Löschen Sie im Projekt ContosoExpenses.Core die Packages.config Datei.

  3. Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Core, und wählen Sie NuGet-Pakete verwaltenaus.

  4. Klicken Sie im Fenster NuGet-Paket-Manager auf Durchsuchen. Suchen Sie nach dem Unity-Paket, und installieren Sie die neueste stabile Version.

    Unity-Paket

  5. Suchen Sie nach dem MvvmLightLibsStd10-Paket, und installieren Sie die neueste stabile Version. Dies ist die .NET Standard-Version des MvvmLightLibs-Pakets. Für dieses Paket hat der Autor die .NET Standard-Version der Bibliothek in einem separaten Paket als die .NET Framework-Version verpackt.

    MvvmLightsLibs-Paket

  6. Klicken Sie im Projekt ContosoExpenses.Core mit der rechten Maustaste auf den Knoten Abhängigkeiten, und wählen Sie Hinzufügen von Verweisaus.

  7. Wählen Sie in der Kategorie Projekte > LösungContosoExpenses.Data aus, und klicken Sie auf OK.

    Verweis hinzufügen

Automatisch generierte Assemblyattribute deaktivieren

Wenn Sie an diesem Punkt des Migrationsprozesses versuchen, das ContosoExpenses.Core Projekt zu erstellen, werden einige Fehler angezeigt.

.NET Core 3 verursacht neue Fehler

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.

  1. 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.

  2. 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>
    
  3. Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Core und wählen Sie Projekt neu ladenaus.

  4. 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.

  5. 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>
    
  6. 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.

  1. Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Data.

  2. Wählen Sie NuGet-Pakete verwaltenaus.

  3. Klicken Sie im Fenster NuGet-Paket-Manager auf Durchsuchen. Suchen Sie nach dem Microsoft.Windows.Compatibility-Paket, und installieren Sie die neueste stabile Version.

    NuGet-Paket installieren

  4. 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.

  1. Klicken Sie mit der rechten Maustaste auf das projekt ContosoExpenses.Core, und wählen Sie Als Startprojekt festlegenaus.

  2. Drücken Sie F5, um das ContosoExpenses.Core Projekt im Debugger zu starten. Es wird eine Ausnahme ähnlich der folgenden angezeigt.

    Angezeigte Ausnahme in Visual Studio

    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.

  3. Beenden Sie den Debugger.

  4. 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.

  5. Fügen Sie vor dem schließenden Project-Element den folgenden Eintrag hinzu:

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Klicken Sie mit der rechten Maustaste auf das Projekt ContosoExpenses.Core und wählen Sie Projekt neu ladenaus.

  7. 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.

    Contoso-Symbol in den Projekteigenschaften

  8. Klicken Sie auf Speichern.

  9. 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.