Delen via


Deel 1: De Contoso Expense-app migreren naar .NET Core 3

Dit is het eerste deel van een handleiding die laat zien hoe u een desktopapp met de naam Contoso Expenses, kunt moderniseren. Zie Zelfstudie: Een WPF-app moderniserenvoor een overzicht van de zelfstudie, vereisten en instructies voor het downloaden van de voorbeeld-app.

In dit deel van de handleiding migreert u de gehele Contoso Expenses-app van .NET Framework 4.7.2 naar .NET Core 3. Voordat u aan dit deel van de zelfstudie begint, moet u ervoor zorgen dat u het contosoExpenses-voorbeeld opent en bouwt in Visual Studio 2019.

Opmerking

Zie deze blogserie voor meer informatie over het migreren van een WPF-toepassing van .NET Framework naar .NET Core 3.

Het Project ContosoExpenses migreren naar .NET Core 3

In deze sectie migreert u het Project ContosoExpenses in de app Contoso Expenses naar .NET Core 3. U doet dit door een nieuw projectbestand te maken dat dezelfde bestanden bevat als het bestaande ContosoExpenses-project, maar als doel heeft op .NET Core 3 in plaats van op .NET Framework 4.7.2. Hiermee kunt u één oplossing onderhouden met zowel .NET Framework- als .NET Core-versies van de app.

  1. Controleer of het Project ContosoExpenses momenteel is gericht op .NET Framework 4.7.2. Klik in Solution Explorer met de rechtermuisknop op het Project ContosoExpenses , kies Eigenschappen en controleer of de eigenschap Target Framework op het tabblad Toepassing is ingesteld op .NET Framework 4.7.2.

    .NET Framework versie 4.7.2 voor het project

  2. Navigeer in Windows Verkenner naar de map C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses en maak een nieuw tekstbestand met de naam ContosoExpenses.Core.csproj.

  3. Klik met de rechtermuisknop op het bestand, kies Openen meten open het in een teksteditor van uw keuze, zoals Kladblok, Visual Studio Code of Visual Studio.

  4. Kopieer de volgende tekst naar het bestand en sla deze op.

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. Sluit het bestand en ga terug naar de Oplossing ContosoExpenses in Visual Studio.

  6. Klik met de rechtermuisknop op de contosoExpenses-oplossing en kies Toevoegen -> Bestaand project. Selecteer het bestand ContosoExpenses.Core.csproj dat u zojuist hebt gemaakt in de C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses map om het toe te voegen aan de oplossing.

De ContosoExpenses.Core.csproj bevat de volgende elementen:

  • Het element Project geeft een SDK-versie van Microsoft.NET.Sdk.WindowsDesktop op. Dit verwijst naar .NET-toepassingen voor Windows Desktop en bevat onderdelen voor WPF- en Windows Forms-apps.
  • Het Element PropertyGroup bevat onderliggende elementen die aangeven dat de projectuitvoer een uitvoerbaar bestand is (geen DLL), is bedoeld voor .NET Core 3 en WPF gebruikt. Voor een Windows Forms-app gebruikt u een UseWinForms-element in plaats van het UseWPF-element .

Opmerking

Wanneer u werkt met de .csproj-indeling die is geïntroduceerd met .NET Core 3.0, worden alle bestanden in dezelfde map als de .csproj beschouwd als onderdeel van het project. Daarom hoeft u niet elk bestand op te geven dat in het project is opgenomen. U moet alleen de bestanden opgeven waarvoor u een aangepaste buildactie wilt definiëren of die u wilt uitsluiten.

Het project ContosoExpenses.Data migreren naar .NET Standard

De oplossing ContosoExpenses bevat een klassebibliotheek ContosoExpenses.Data met modellen en interfaces voor services en is gericht op .NET 4.7.2. .NET Core 3.0-apps kunnen .NET Framework-bibliotheken gebruiken, zolang ze geen API's gebruiken die niet beschikbaar zijn in .NET Core. Het beste moderniseringspad is echter om uw bibliotheken te verplaatsen naar .NET Standard. Dit zorgt ervoor dat uw bibliotheek volledig wordt ondersteund door uw .NET Core 3.0-app. Daarnaast kunt u de bibliotheek ook opnieuw gebruiken met andere platforms, zoals web (via ASP.NET Core).

Het project ContosoExpenses.Data migreren naar .NET Standard:

  1. Klik in Visual Studio met de rechtermuisknop op het project ContosoExpenses.Data en kies Project verwijderen. Klik opnieuw met de rechtermuisknop op het project en kies Vervolgens ContosoExpenses.Data.csproj bewerken.

  2. Verwijder de volledige inhoud van het projectbestand.

  3. Kopieer en plak de volgende XML en sla het bestand op.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. Klik met de rechtermuisknop op het project ContosoExpenses.Data en kies Project opnieuw laden.

NuGet-pakketten en -afhankelijkheden configureren

Wanneer u de ContosoExpenses.Core en contosoExpenses.Data projecten in de vorige secties heeft gemigreerd, heeft u de NuGet-pakketverwijzingen uit de projecten verwijderd. In deze sectie voegt u deze verwijzingen terug.

NuGet-pakketten configureren voor het project ContosoExpenses.Data :

  1. In het project ContosoExpenses.Data vouw het Knooppunt Dependencies uit. Houd er rekening mee dat de NuGet-sectie ontbreekt.

    NuGet-pakketten

    Als u de Packages.config opent in Solution Explorer , vindt u de 'oude' verwijzingen van de NuGet-pakketten die het project gebruikten toen het volledige .NET Framework werd gebruikt.

    Afhankelijkheden en pakketten

    Hier volgt de inhoud van het bestandPackages.config . U ziet dat alle NuGet-pakketten gericht zijn op full .NET Framework 4.7.2:

    <?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. Verwijder in het project ContosoExpenses.Data het Packages.config-bestand .

  3. Klik in het project ContosoExpenses.Data met de rechtermuisknop op het knooppunt Afhankelijkheden en kies NuGet-pakketten beheren.

NuGet-pakketten beheren...

  1. Klik in het venster NuGet Package Manager op Bladeren.... Zoek het Bogus pakket en installeer de nieuwste stabiele versie.

    Bogus NuGet-pakket

  2. Zoek het LiteDB pakket en installeer de nieuwste stabiele versie.

    LiteDB NuGet-pakket

    U vraagt zich misschien af waar deze lijst met NuGet-pakketten wordt opgeslagen, omdat het project geen packages.config bestand meer heeft. De NuGet-pakketten waarnaar wordt verwezen, worden rechtstreeks opgeslagen in het .csproj-bestand. U kunt dit controleren door de inhoud van het projectbestand ContosoExpenses.Data.csproj in een teksteditor weer te geven. U vindt de volgende regels aan het einde van het bestand:

    <ItemGroup>
       <PackageReference Include="Bogus" Version="26.0.2" />
       <PackageReference Include="LiteDB" Version="4.1.4" />
    </ItemGroup>
    

    Opmerking

    U ziet mogelijk ook dat u dezelfde pakketten voor dit .NET Core 3-project installeert als pakketten die worden gebruikt door .NET Framework 4.7.2-projecten. NuGet-pakketten bieden ondersteuning voor meerdere targeting. Auteurs van bibliotheken kunnen verschillende versies van een bibliotheek in hetzelfde pakket opnemen, gecompileerd voor verschillende architecturen en platforms. Deze pakketten ondersteunen het volledige .NET Framework en .NET Standard 2.0, dat compatibel is met .NET Core 3-projecten. Zie .NET Standard voor meer informatie over de verschillen .NET Framework, .NET Core en .NET Standard.

Configureer de NuGet-pakketten voor het project ContosoExpenses.Core:

  1. Open het packages.config-bestand in het project ContosoExpenses.Core. U ziet dat het momenteel de volgende verwijzingen bevat die gericht zijn op .NET Framework 4.7.2.

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

    Bij de volgende stappen behandelt u .NET Standard-versies van de MvvmLightLibs- en Unity-pakketten. De andere twee zijn afhankelijkheden die automatisch door NuGet worden gedownload wanneer u deze twee bibliotheken installeert.

  2. Verwijder het Packages.config-bestand in het project ContosoExpenses.Core.

  3. Klik met de rechtermuisknop op het project ContosoExpenses.Core en kies NuGet-pakketten beheren.

  4. Klik in het venster NuGet Package Manager op Bladeren.... Zoek het Unity pakket en installeer de nieuwste stabiele versie.

    Unity-pakket

  5. Zoek het MvvmLightLibsStd10 pakket en installeer de nieuwste stabiele versie. Dit is de .NET Standard-versie van het MvvmLightLibs pakket. Voor dit pakket heeft de auteur ervoor gekozen om de .NET Standard-versie van de bibliotheek in een afzonderlijk pakket te verpakken dan de .NET Framework-versie.

    MvvmLightsLibs-pakket

  6. Klik in het project ContosoExpenses.Core met de rechtermuisknop op de node Afhankelijkheden en kies Referentie toevoegen.

  7. Selecteer binnen de categorie Projects > Solution, ContosoExpenses.Data en klik op OK.

    Verwijzing toevoegen

Automatisch gegenereerde assemblykenmerken uitschakelen

Op dit moment in het migratieproces ziet u enkele fouten als u het Project ContosoExpenses.Core probeert te bouwen.

Nieuwe buildfouten voor .NET Core 3

Dit probleem treedt op omdat de nieuwe .csproj-indeling die is geïntroduceerd met .NET Core 3.0, de assembly-informatie opslaat in het projectbestand in plaats van het AssemblyInfo.cs-bestand . U kunt deze fouten oplossen door dit gedrag uit te schakelen en het project het AssemblyInfo.cs-bestand te laten gebruiken.

  1. Klik in Visual Studio met de rechtermuisknop op het project ContosoExpenses.Core en kies Project-verwijderen. Klik opnieuw met de rechtermuisknop op het project en kies Vervolgens ContosoExpenses.Core.csproj bewerken.

  2. Voeg het volgende element toe in de sectie PropertyGroup en sla het bestand op.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Nadat u dit element hebt toegevoegd, moet de sectie PropertyGroup er nu als volgt uitzien:

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. Klik met de rechtermuisknop op het project ContosoExpenses.Core en kies Project opnieuw laden.

  4. Klik met de rechtermuisknop op het project ContosoExpenses.Data en kies Project-verwijderen. Klik opnieuw met de rechtermuisknop op het project en kies Vervolgens ContosoExpenses.Data.csproj bewerken.

  5. Voeg dezelfde vermelding toe in de sectie PropertyGroup en sla het bestand op.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Nadat u dit element hebt toegevoegd, moet de sectie PropertyGroup er nu als volgt uitzien:

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. Klik met de rechtermuisknop op het project ContosoExpenses.Data en kies Project opnieuw laden.

Het Windows-compatibiliteitspakket toevoegen

Als u nu probeert de projecten ContosoExpenses.Core en ContosoExpenses.Data te compileren, ziet u dat de vorige fouten nu zijn opgelost, maar dat er nog steeds enkele fouten zijn in de contosoExpenses.Data-bibliotheek die er ongeveer als volgt uitzien.

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

Deze fouten zijn het gevolg van het converteren van het ContosoExpenses.Data-project van een .NET Framework-bibliotheek (die specifiek is voor Windows) naar een .NET Standard-bibliotheek, die kan worden uitgevoerd op meerdere platforms, waaronder Linux, Android, iOS en meer. Het project ContosoExpenses.Data bevat een klasse met de naam RegistryService, die communiceert met het register, een concept met alleen Windows.

Als u deze fouten wilt oplossen, installeert u het NuGet-pakket windowscompatibiliteit . Dit pakket biedt ondersteuning voor veel Windows-specifieke API's die moeten worden gebruikt in een .NET Standard-bibliotheek. De bibliotheek wordt niet langer platformoverschrijdend na het gebruik van dit pakket, maar is nog steeds gericht op .NET Standard.

  1. Klik met de rechtermuisknop op het project ContosoExpenses.Data .

  2. Kies NuGet-pakketten beheren.

  3. Klik in het venster NuGet Package Manager op Bladeren.... Zoek het Microsoft.Windows.Compatibility pakket en installeer de nieuwste stabiele versie.

    NuGet-pakket installeren

  4. Probeer het project nu opnieuw te compileren door met de rechtermuisknop op het project ContosoExpenses.Data te klikken en Build te kiezen.

Deze keer wordt het buildproces zonder fouten voltooid.

De migratie testen en fouten opsporen

Nu de projecten met succes zijn opgebouwd, kunt u de app uitvoeren en testen om te zien of er uitvoeringsfouten zijn.

  1. Klik met de rechtermuisknop op het project ContosoExpenses.Core en kies Instellen als opstartproject.

  2. Druk op F5 om het Project ContosoExpenses.Core te starten in het foutopsporingsprogramma. U ziet een uitzondering die vergelijkbaar is met de volgende.

    Uitzondering weergegeven in Visual Studio

    Deze uitzondering wordt gegenereerd omdat u bij het verwijderen van de inhoud uit het .csproj-bestand aan het begin van de migratie de informatie over de build-actie voor de afbeeldingsbestanden hebt verwijderd. Met de volgende stappen lost u dit probleem op.

  3. Stop het foutopsporingsprogramma.

  4. Klik met de rechtermuisknop op het project ContosoExpenses.Core en kies Projectverwijderen. Klik opnieuw met de rechtermuisknop op het project en kies Vervolgens ContosoExpenses.Core.csproj bewerken.

  5. Voeg vóór het afsluitende Project-element de volgende vermelding toe:

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Klik met de rechtermuisknop op het project ContosoExpenses.Core en kies Project opnieuw laden.

  7. Als u de Contoso.ico aan de app wilt toewijzen, klikt u met de rechtermuisknop op het project ContosoExpenses.Core en kiest u Eigenschappen. Klik op de geopende pagina op de vervolgkeuzelijst onder het -pictogram en selecteer Images\contoso.ico.

    Contoso-pictogram in de eigenschappen van het project

  8. Klik op Opslaan.

  9. Druk op F5 om het Project ContosoExpenses.Core te starten in het foutopsporingsprogramma. Controleer of de app nu wordt uitgevoerd.

Volgende stappen

Op dit moment in de handleiding hebt u de Contoso Expenses-app gemigreerd naar .NET Core 3. U bent nu klaar voor deel 2: Een UWP InkCanvas-besturingselement toevoegen met behulp van XAML-eilanden.

Opmerking

Als u een scherm met hoge resolutie hebt, ziet u mogelijk dat de app er erg klein uitziet. In de volgende stap van de zelfstudie gaat u dit probleem oplossen.