Share via


Parte 1: Eseguire la migrazione dell'app Contoso Expenses a .NET Core 3

Questa è la prima parte di un'esercitazione che illustra come modernizzare un'app desktop WPF di esempio denominata Contoso Expenses. Per una panoramica dell'esercitazione, dei prerequisiti e delle istruzioni per il download dell'app di esempio, vedere Esercitazione: Modernizzare un'app WPF.

In questa parte dell'esercitazione eseguirai la migrazione dell'intera app Contoso Expenses da .NET Framework 4.7.2 a .NET Core 3. Prima di iniziare questa parte dell'esercitazione, assicurati di aprire e compilare l'esempio ContosoExpenses in Visual Studio 2019.

Nota

Per altre informazioni sulla migrazione di un'applicazione WPF da .NET Framework a .NET Core 3, vedi questa serie di blog.

Eseguire la migrazione del progetto ContosoExpenses a .NET Core 3

In questa sezione eseguirai la migrazione del progetto ContosoExpenses dell'app Contoso Expenses a .NET Core 3. A tale scopo, creerai un nuovo file di progetto contenente gli stessi file del progetto ContosoExpenses esistente ma destinati a .NET Core 3 anziché a .NET Framework 4.7.2. In questo modo è possibile gestire una singola soluzione con le versioni .NET Framework e .NET Core dell'app.

  1. Verifica che il progetto ContosoExpenses sia attualmente destinato a .NET Framework 4.7.2. In Esplora soluzioni fai clic con il pulsante destro del mouse sul progetto ContosoExpenses, scegli Proprietà e verifica che la proprietà Framework di destinazione nella scheda Applicazione sia impostata su .NET Framework 4.7.2.

    .NET Framework version 4.7.2 for the project

  2. In Esplora risorse passa alla cartella C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses e crea un nuovo file di testo denominato ContosoExpenses.Core.csproj.

  3. Fai clic con il pulsante destro del mouse sul file, scegli Apri con e quindi aprilo in un editor di testo a tua scelta, ad esempio il Blocco note, Visual Studio Code o Visual Studio.

  4. Copia il testo seguente nel file e salvalo.

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
     </PropertyGroup>
    
    </Project>
    
  5. Chiudi il file e torna alla soluzione ContosoExpenses in Visual Studio.

  6. Fare clic con il pulsante destro del mouse sulla soluzione ContosoExpenses e scegliere Aggiungi - > Progetto esistente. Seleziona il file ContosoExpenses.Core.csproj appena creato nella cartella C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses per aggiungerlo alla soluzione.

Il file ContosoExpenses.Core.csproj include gli elementi seguenti:

  • L'elemento Project specifica una versione SDK di Microsoft.NET.Sdk.WindowsDesktop. Fa riferimento alle applicazioni .NET per Windows Desktop e include componenti per le app WPF e Windows Forms.
  • L'elemento PropertyGroup contiene elementi figlio che indicano che l'output del progetto è un eseguibile (non una DLL), è destinato a .NET Core 3 e usa WPF. Per un'app Windows Forms, dovrai usare un elemento UseWinForms anziché l'elemento UseWPF.

Nota

Quando viene usato il formato csproj introdotto con .NET Core 3.0, tutti i file contenuti nella stessa cartella del file con estensione csproj sono considerati come parte del progetto. Non è quindi necessario specificare ogni file incluso nel progetto. Devi specificare solo i file per i quali vuoi definire un'azione di compilazione personalizzata o che vuoi escludere.

Eseguire la migrazione del progetto ContosoExpenses.Data a .NET Standard

La soluzione ContosoExpenses include una libreria di classi ContosoExpenses.Data contenente modelli e interfacce per servizi e la cui destinazione è .NET 4.7.2. Le app .NET Core 3.0 possono usare le librerie .NET Framework, purché non usino API non disponibili in .NET Core. Tuttavia, il percorso di modernizzazione ottimale prevede di spostare le librerie in .NET Standard. In questo modo la libreria sarà completamente supportata dall'app .NET Core 3.0. Puoi inoltre riusare la libreria anche con altre piattaforme, ad esempio Web (tramite ASP.NET Core) e mobili (tramite Xamarin).

Per eseguire la migrazione del progetto ContosoExpenses.Data a .NET Standard:

  1. In Visual Studio fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegli Scarica progetto. Fai di nuovo clic con il pulsante destro del mouse sul progetto e quindi scegli Modifica ContosoExpenses.Data.csproj.

  2. Elimina tutto il contenuto del file di progetto.

  3. Copia e incolla il codice XML seguente e salva il file.

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  4. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegli Ricarica progetto.

Configurare i pacchetti NuGet e le dipendenze

Quando hai eseguito la migrazione dei progetti ContosoExpenses.Core e ContosoExpenses.Data nelle sezioni precedenti, hai rimosso dai progetti i riferimenti ai pacchetti NuGet. In questa sezione aggiungerai di nuovo questi riferimenti.

Per configurare i pacchetti NuGet per il progetto ContosoExpenses.Data:

  1. Nel progetto ContosoExpenses.Data espandi il nodo Dipendenze. La sezione NuGet è mancante.

    NuGet packages

    Se apri il file Packages.config in Esplora soluzioni troverai i riferimenti "precedenti" dei pacchetti NuGet usati dal progetto basato su .NET Framework completo.

    Dependencies and packages

    Ecco il contenuto del file Packages.config. Noterai che tutti i pacchetti NuGet sono destinati alla versione .NET Framework 4.7.2 completa:

    <?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. Nel progetto ContosoExpenses.Data elimina il file Packages.config.

  3. Nel progetto ContosoExpenses.Data fai clic con il pulsante destro del mouse sul nodo Dipendenze e scegli Gestisci pacchetti NuGet.

Manage NuGet Packages...

  1. Nella finestra Gestione pacchetti NuGet fai clic su Sfoglia. Cerca il pacchetto Bogus e installa la versione stabile più recente.

    Bogus NuGet package

  2. Cerca il pacchetto LiteDB e installa la versione stabile più recente.

    LiteDB NuGet package

    Potresti chiederti dove sia archiviato questo elenco di pacchetti NuGet, poiché il progetto non contiene più un file Packages.config. I pacchetti NuGet di riferimento vengono archiviati direttamente nel file con estensione csproj. Per verificarlo, puoi visualizzare il contenuto del file di progetto ContosoExpenses.Data.csproj in un editor di testo. Alla fine del file troverai che sono state aggiunte le righe seguenti:

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

    Nota

    Noterai anche che per questo progetto .NET Core 3 stai installando gli stessi pacchetti usati dai progetti .NET Framework 4.7.2. I pacchetti NuGet supportano la funzionalità multitargeting. Gli autori di librerie possono includere nello stesso pacchetto versioni diverse di una libreria, compilate per architetture e piattaforme diverse. Questi pacchetti supportano .NET Framework completo, nonché .NET Standard 2.0, che è compatibile con i progetti .NET Core 3. Per altre informazioni sulle differenze tra .NET Framework, .NET Core e .NET Standard, vedi .NET Standard.

Per configurare i pacchetti NuGet per il progetto ContosoExpenses.Core:

  1. Nel progetto ContosoExpenses.Core apri il file Packages.config. Considera che attualmente contiene i riferimenti seguenti destinati a .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>
    

    Nei passaggi seguenti applicherai .NET Standard per le versioni dei pacchetti MvvmLightLibs e Unity. Le altre due sono dipendenze scaricate automaticamente da NuGet con l'installazioine di queste due librerie.

  2. Nel progetto ContosoExpenses.Core elimina il file Packages.config.

  3. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Gestisci pacchetti NuGet.

  4. Nella finestra Gestione pacchetti NuGet fai clic su Sfoglia. Cerca il pacchetto Unity e installa la versione stabile più recente.

    Unity package

  5. Cerca il pacchetto MvvmLightLibsStd10 e installa la versione stabile più recente. Si tratta della versione .NET Standard del pacchetto MvvmLightLibs. Per questo pacchetto, l'autore ha scelto di inserire la versione .NET Standard della libreria in un pacchetto separato rispetto alla versione .NET Framework.

    MvvmLightsLibs package

  6. Nel progetto ContosoExpenses.Core fai clic con il pulsante destro del mouse sul nodo Dipendenze e scegli Aggiungi riferimento.

  7. Nella categoria Progetti > Soluzione selezionare ContosoExpenses.Data e fai clic su OK.

    Add Reference

Disabilitare gli attributi di assembly generati automaticamente

Se a questo punto del processo di migrazione provi a compilare il progetto ContosoExpenses.Core, visualizzerai alcuni errori.

.NET Core 3 build new errors

Questo problema si verifica perché il nuovo formato csproj introdotto con .NET Core 3.0 archivia le informazioni dell'assembly nel file di progetto anziché nel file AssemblyInfo.cs. Per correggere questi errori, disabilita questo comportamento e fai in modo che il progetto continui a usare il file AssemblyInfo.cs.

  1. In Visual Studio fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Scarica progetto. Fai di nuovo clic con il pulsante destro del mouse sul progetto e quindi scegli Modifica ContosoExpenses.Core.csproj.

  2. Aggiungi l'elemento seguente nella sezione PropertyGroup e salva il file.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Dopo aver aggiunto questo elemento, la sezione PropertyGroup dovrebbe essere simile alla seguente:

    <PropertyGroup>
      <OutputType>WinExe</OutputType>
      <TargetFramework>netcoreapp3.0</TargetFramework>
      <UseWPF>true</UseWPF>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  3. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Ricarica progetto.

  4. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegli Scarica progetto. Fai di nuovo clic con il pulsante destro del mouse sul progetto e quindi scegli Modifica ContosoExpenses.Data.csproj.

  5. Aggiungi la stessa voce nella sezione PropertyGroup e salva il file.

    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    

    Dopo aver aggiunto questo elemento, la sezione PropertyGroup dovrebbe essere simile alla seguente:

    <PropertyGroup>
      <TargetFramework>netstandard2.0</TargetFramework>
      <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    </PropertyGroup>
    
  6. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegli Ricarica progetto.

Aggiungere Windows Compatibility Pack

Se provi ora a compilare i progetti ContosoExpenses.Core e ContosoExpenses.Data, noterai che gli errori precedenti sono stati corretti, ma nella libreria ContosoExpenses Data sono ancora presenti errori simili a quelli riportati di seguito.

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

Questi errori sono il risultato della conversione del progetto ContosoExpenses.Data da una libreria .NET Framework, specifica per Windows, a una libreria .NET Standard, che può essere eseguita su più piattaforme, tra cui Linux, Android, iOS e altro ancora. Il progetto ContosoExpenses.Data contiene una classe denominata RegistryService che interagisce con il Registro di sistema, un concetto esclusivamente di Windows.

Per risolvere questi errori, installa il pacchetto NuGet Windows Compatibility. Questo pacchetto fornisce il supporto per molte API specifiche di Windows da usare in una libreria .NET Standard. La libreria non sarà più multipiattaforma dopo l'uso del pacchetto, ma sarà comunque destinata a .NET Standard.

  1. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data.

  2. Scegli Gestisci pacchetti NuGet.

  3. Nella finestra Gestione pacchetti NuGet fai clic su Sfoglia. Cerca il pacchetto Microsoft.Windows.Compatibility e installa la versione stabile più recente.

    Install NuGet package

  4. A questo punto, riprova a compilare il progetto facendo clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegliendo Compila.

Questa volta il processo di compilazione verrà completato senza errori.

Eseguire il test e il debug della migrazione

Ora che i progetti vengono compilati correttamente, puoi procedere con l'esecuzione e il test dell'app per verificare l'eventuale presenza di errori di runtime.

  1. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Imposta come progetto di avvio.

  2. Premi F5 per avviare il progetto ContosoExpenses.Core nel debugger. Visualizzerai un'eccezione simile alla seguente.

    Exception displayed in Visual Studio

    Questa eccezione viene generata perché quando hai eliminato il contenuto dal file csproj all'inizio della migrazione, hai rimosso le informazioni relative all'azione di compilazione per i file di immagine. Per risolvere il problema, segui questa procedura.

  3. Arresta il debugger.

  4. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Scarica progetto. Fai di nuovo clic con il pulsante destro del mouse sul progetto e quindi scegli Modifica ContosoExpenses.Core.csproj.

  5. Prima dell'elemento Project di chiusura, aggiungi la voce seguente:

    <ItemGroup>
      <Content Include="Images/*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
  6. Fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Ricarica progetto.

  7. Per assegnare Contoso.ico all'app, fai clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegli Proprietà. Nella pagina aperta fai clic sull'elenco a discesa sotto Icona e seleziona Images\contoso.ico.

    Contoso icon in the Project's Properties

  8. Fai clic su Salva.

  9. Premi F5 per avviare il progetto ContosoExpenses.Core nel debugger. Verifica che l'app ora venga eseguita.

Passaggi successivi

A questo punto dell'esercitazione hai eseguito correttamente la migrazione dell'app Contoso Expenses a .NET Core 3. Ora è possibile iniziare la Parte 2: Aggiungere un controllo InkCanvas UWP con XAML Islands.

Nota

Se disponi di uno schermo ad alta risoluzione, puoi notare che l'app risulta di dimensioni ridotte. Affronterai questo problema nel passaggio successivo dell'esercitazione.