Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här är den första delen av en självstudiekurs som visar hur du moderniserar en WPF-exempelapp med namnet Contoso Expenses. För en översikt över självstudien, förutsättningarna och instruktionerna för att ladda ned exempelappen, se Självstudie: Modernisera en WPF-app.
I den här delen av självstudien migrerar du hela Contoso Expenses-appen från .NET Framework 4.7.2 till .NET Core 3. Innan du börjar den här delen av självstudien måste du öppna och skapa ContosoExpenses-exempel i Visual Studio 2019.
Anmärkning
Mer information om hur du migrerar ett WPF-program från .NET Framework till .NET Core 3 finns i den här bloggserien.
Migrera ContosoExpenses-projektet till .NET Core 3
I det här avsnittet migrerar du ContosoExpenses-projektet i Contoso Expenses-appen till .NET Core 3. Du gör detta genom att skapa en ny projektfil som innehåller samma filer som det befintliga ContosoExpenses-projektet men som riktar sig till .NET Core 3 i stället för .NET Framework 4.7.2. På så sätt kan du underhålla en enda lösning med både .NET Framework- och .NET Core-versioner av appen.
Kontrollera att ContosoExpenses-projektet för närvarande är inriktat på .NET Framework 4.7.2. Högerklicka på Projektet ContosoExpenses i Solution Explorer, välj Egenskaper och bekräfta att egenskapen Target framework på fliken Program är inställd på .NET Framework 4.7.2.
I Utforskaren navigerar du till mappen C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses och skapar en ny textfil med namnet ContosoExpenses.Core.csproj.
Högerklicka på filen, välj Öppna med och öppna den sedan i valfri textredigerare, till exempel Anteckningar, Visual Studio Code eller Visual Studio.
Kopiera följande text till filen och spara den.
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> </Project>
Stäng filen och gå tillbaka till ContosoExpenses-lösningen i Visual Studio.
Högerklicka på ContosoExpenses-lösningen och välj Lägg till –> befintligt projekt. Välj filen ContosoExpenses.Core.csproj som du nyss skapade i
C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses
mappen för att lägga till den i lösningen.
ContosoExpenses.Core.csproj innehåller följande element:
- Project-elementet anger en SDK-version av Microsoft.NET.Sdk.WindowsDesktop. Detta refererar till .NET-program för Windows Desktop och innehåller komponenter för WPF- och Windows Forms-appar.
- Elementet PropertyGroup innehåller underordnade element som indikerar att projektutdata är en körbar fil (inte en DLL), riktar in sig på .NET Core 3 och använder WPF. För en Windows Forms-app använder du ett UseWinForms-element i stället för UseWPF-elementet .
Anmärkning
När du arbetar med .csproj-formatet som introducerades med .NET Core 3.0 betraktas alla filer i samma mapp som .csproj som en del av projektet. Därför behöver du inte ange alla filer som ingår i projektet. Du måste bara ange de filer som du vill definiera en anpassad byggåtgärd för eller som du vill exkludera.
Migrera ContosoExpenses.Data-projektet till .NET Standard
ContosoExpenses-lösningen innehåller ett ContosoExpenses.Data-klassbibliotek som innehåller modeller och gränssnitt för tjänster och riktar sig till .NET 4.7.2. .NET Core 3.0-appar kan använda .NET Framework-bibliotek så länge de inte använder API:er som inte är tillgängliga i .NET Core. Den bästa moderniseringsvägen är dock att flytta biblioteken till .NET Standard. Detta säkerställer att biblioteket stöds fullt ut av .NET Core 3.0-appen. Dessutom kan du återanvända biblioteket även med andra plattformar, till exempel webben (via ASP.NET Core).
Så här migrerar du ContosoExpenses.Data-projektet till .NET Standard:
Högerklicka på projektet ContosoExpenses.Data i Visual Studio och välj Ta bort projekt. Högerklicka på projektet igen och välj sedan Redigera ContosoExpenses.Data.csproj.
Ta bort hela innehållet i projektfilen.
Kopiera och klistra in följande XML och spara filen.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> </Project>
Högerklicka på projektet ContosoExpenses.Data och välj Läs in projektet på nytt.
Konfigurera NuGet-paket och beroenden
När du migrerade projekten ContosoExpenses.Core och ContosoExpenses.Data i föregående avsnitt tog du bort NuGet-paketreferenserna från projekten. I det här avsnittet lägger du tillbaka dessa referenser.
Så här konfigurerar du NuGet-paket för projektet ContosoExpenses.Data :
I projektet ContosoExpenses.Data expanderar du noden Beroenden . Observera att NuGet-avsnittet saknas.
Om du öppnar Packages.config i Solution Explorer hittar du de "gamla" referenserna för De NuGet-paket som använde projektet när det använde hela .NET Framework.
Här är innehållet i Packages.config-filen . Du kommer att märka att alla NuGet-paket är inriktade på 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>
I projektet ContosoExpenses.Data, ta bort filen Packages.config.
I projektet ContosoExpenses.Data högerklickar du på noden Beroenden och väljer Hantera NuGet-paket.
I fönstret NuGet Package Manager klickar du på Bläddra. Sök
Bogus
efter paketet och installera den senaste stabila versionen.Sök
LiteDB
efter paketet och installera den senaste stabila versionen.Du kanske undrar var den här listan över NuGet-paket lagras, eftersom projektet inte längre har en packages.config fil. De refererade NuGet-paketen lagras direkt i .csproj-filen. Du kan kontrollera detta genom att visa innehållet i projektfilen ContosoExpenses.Data.csproj i en textredigerare. Följande rader har lagts till i slutet av filen:
<ItemGroup> <PackageReference Include="Bogus" Version="26.0.2" /> <PackageReference Include="LiteDB" Version="4.1.4" /> </ItemGroup>
Anmärkning
Du kanske också märker att du installerar samma paket för det här .NET Core 3-projektet som de som används av .NET Framework 4.7.2-projekt. NuGet-paket har stöd för flera mål. Biblioteksförfattare kan inkludera olika versioner av ett bibliotek i samma paket, kompilerade för olika arkitekturer och plattformar. Dessa paket stöder hela .NET Framework samt .NET Standard 2.0, som är kompatibelt med .NET Core 3-projekt. Mer information om skillnaderna mellan .NET Framework, .NET Core och .NET Standard finns i .NET Standard.
Så här konfigurerar du NuGet-paket för ContosoExpenses.Core-projektet :
I projektet ContosoExpenses.Core öppnar du filen packages.config. Observera att den för närvarande innehåller följande referenser som är avsedda för .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>
I följande steg kommer du att använda .NET Standard-versioner av paketen
MvvmLightLibs
ochUnity
. De andra två är beroenden som hämtas automatiskt av NuGet när du installerar dessa två bibliotek.I projektet ContosoExpenses.Core tar du bort filen Packages.config.
Högerklicka på projektet ContosoExpenses.Core och välj Hantera NuGet-paket.
I fönstret NuGet Package Manager klickar du på Bläddra. Sök
Unity
efter paketet och installera den senaste stabila versionen.Sök
MvvmLightLibsStd10
efter paketet och installera den senaste stabila versionen. Det här är .NET Standard-versionen avMvvmLightLibs
paketet. För det här paketet valde författaren att paketera .NET Standard-versionen av biblioteket i ett separat paket än .NET Framework-versionen.Högerklicka på noden Beroenden i contosoExpenses.Core-projektet och välj Lägg till referens.
I kategorin Projektlösning > väljer du ContosoExpenses.Data och klickar på OK.
Inaktivera automatiskt genererade sammansättningsattribut
Vid denna punkt i migrationsprocessen, om du försöker bygga ContosoExpenses.Core-projektet kommer du att se några fel.
Det här problemet uppstår eftersom det nya .csproj-formatet som introducerades med .NET Core 3.0 lagrar sammansättningsinformationen i projektfilen i stället för den AssemblyInfo.cs filen. Du kan åtgärda dessa fel genom att inaktivera det här beteendet och låta projektet fortsätta att använda filen AssemblyInfo.cs .
Högerklicka på projektet ContosoExpenses.Core i Visual Studio och välj Ta bort projekt. Högerklicka på projektet igen och välj sedan Redigera ContosoExpenses.Core.csproj.
Lägg till följande element i avsnittet PropertyGroup och spara filen.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
När du har lagt till det här elementet bör avsnittet PropertyGroup nu se ut så här:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>
Högerklicka på projektet ContosoExpenses.Core och välj Läs in projektet igen.
Högerklicka på projektet ContosoExpenses.Data och välj Ta bort projekt. Högerklicka på projektet igen och välj sedan Redigera ContosoExpenses.Data.csproj.
Lägg till samma post i avsnittet PropertyGroup och spara filen.
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
När du har lagt till det här elementet bör avsnittet PropertyGroup nu se ut så här:
<PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>
Högerklicka på projektet ContosoExpenses.Data och välj Läs in projektet på nytt.
Lägg till Windows-kompatibilitetspaketet
Om du nu försöker kompilera projekten ContosoExpenses.Core och ContosoExpenses.Data ser du att de tidigare felen nu har åtgärdats, men det finns fortfarande några fel i ContosoExpenses.Data-biblioteket som liknar dessa.
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
Dessa fel beror på att projektet ContosoExpenses.Data omvandlades från ett .NET Framework-bibliotek (som är specifikt för Windows) till ett .NET Standard-bibliotek, som kan köras på flera plattformar, inklusive Linux, Android, iOS och mer. Projektet ContosoExpenses.Data innehåller en klass som heter RegistryService, vilken interagerar med registret, ett Windows-koncept.
Lös dessa fel genom att installera Windows Compatibility NuGet-paketet. Det här paketet ger stöd för många Windows-specifika API:er som ska användas i ett .NET Standard-bibliotek. Biblioteket kommer inte längre att vara plattformsoberoende när det här paketet har använts, men det kommer fortfarande att rikta sig mot .NET Standard.
Högerklicka på projektet ContosoExpenses.Data .
Välj Hantera NuGet-paket.
I fönstret NuGet Package Manager klickar du på Bläddra. Sök
Microsoft.Windows.Compatibility
efter paketet och installera den senaste stabila versionen.Försök nu igen för att kompilera projektet genom att högerklicka på contosoExpenses.Data-projektet och välja Skapa.
Den här gången slutförs byggprocessen utan fel.
Testa och felsöka migreringen
Nu när projekten byggs framgångsrikt är du redo att köra och testa appen för att se om det finns några fel vid körning.
Högerklicka på projektet ContosoExpenses.Core och välj Ange som startprojekt.
Tryck på F5 för att starta ContosoExpenses.Core-projektet i felsökningsprogrammet. Du ser ett undantag som liknar följande.
Det här undantaget genereras eftersom när du tog bort innehållet från .csproj-filen i början av migreringen tog du bort informationen om åtgärden Skapa för avbildningsfilerna. Följande steg åtgärdar det här problemet.
Stoppa felsökningsprogrammet.
Högerklicka på projektet ContosoExpenses.Core och välj Ta bort projekt. Högerklicka på projektet igen och välj sedan Redigera ContosoExpenses.Core.csproj.
Innan du stänger Project-elementet lägger du till följande post:
<ItemGroup> <Content Include="Images/*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
Högerklicka på projektet ContosoExpenses.Core och välj Läs in projektet igen.
Om du vill tilldela Contoso.ico till appen högerklickar du på contosoExpenses.Core-projektet och väljer Egenskaper. På den öppnade sidan klickar du på listrutan under Ikon och väljer
Images\contoso.ico
.Klicka på Spara.
Tryck på F5 för att starta ContosoExpenses.Core-projektet i felsökningsprogrammet. Bekräfta att appen nu körs.
Nästa steg
Vid denna punkt i självstudien har du framgångsrikt migrerat Contoso Expenses-appen till .NET Core 3. Nu är du redo för del 2: Lägg till en UWP InkCanvas-kontroll med hjälp av XAML Islands.
Anmärkning
Om du har en skärm med hög upplösning kan du märka att appen ser mycket liten ut. Du kommer att åtgärda det här problemet i nästa steg i självstudien.
Windows developer