Condividi tramite


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, consulta Esercitazione: Modernizza un'app WPF.

In questa parte dell'esercitazione si eseguirà 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 costruire l'esempio ContosoExpenses in Visual Studio 2019.

Annotazioni

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

Eseguire la migrazione del progetto ContosoExpenses a .NET Core 3

In questa sezione si eseguirà la migrazione del progetto ContosoExpenses nell'app Contoso Expenses a .NET Core 3. A tale scopo, si creerà un nuovo file di progetto che contiene gli stessi file del progetto ContosoExpenses esistente, ma è destinato a .NET Core 3 anziché a .NET Framework 4.7.2. In questo modo è possibile gestire una singola soluzione con le versioni di .NET Framework e .NET Core dell'app.

  1. Verificare che il progetto ContosoExpenses sia attualmente mirato a .NET Framework 4.7.2. Nell'Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto ContosoExpenses, scegliere Proprietàe verificare che la proprietà destinazione del framework nella scheda Applicazione sia impostata su .NET Framework 4.7.2.

    .NET Framework versione 4.7.2 per il progetto

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

  3. Fare clic con il pulsante destro del mouse sul file, scegliere Apri con e quindi aprirlo in un editor di testo di propria scelta, ad esempio Blocco note, Visual Studio Code o Visual Studio.

  4. Copiare il testo seguente nel file e salvarlo.

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

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

Il ContosoExpenses.Core.csproj include gli elementi seguenti:

  • L'elemento Project specifica una versione SDK di Microsoft.NET.Sdk.WindowsDesktop. Questo si riferisce alle applicazioni .NET per Windows Desktop e include componenti per le app WPF e Windows Form.
  • 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, dovresti usare un elemento UseWinForms anziché l'elemento UseWPF.

Annotazioni

Quando si usa il formato csproj introdotto con .NET Core 3.0, tutti i file nella stessa cartella del file con estensione csproj vengono considerati parte del progetto. Pertanto, non è necessario specificare ogni file incluso nel progetto. È necessario specificare solo i file per i quali si desidera definire un'azione di compilazione personalizzata o che si desidera escludere.

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

La soluzione ContosoExpenses include una libreria di classi ContosoExpenses.Data che contiene modelli e interfacce per i servizi e ha come destinazione .NET 4.7.2. Le app .NET Core 3.0 possono usare librerie .NET Framework, purché non usino API non disponibili in .NET Core. Tuttavia, il percorso di modernizzazione migliore consiste nello spostare le librerie in .NET Standard. Ciò garantisce che la libreria sia completamente supportata dall'app .NET Core 3.0. Inoltre, è possibile riutilizzare la libreria anche con altre piattaforme, ad esempio web (tramite ASP.NET Core).

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

  1. In Visual Studio, fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegliere Rimuovi progetto. Fare di nuovo clic con il pulsante destro del mouse sul progetto e scegliere Modifica ContosoExpenses.Data.csproj.

  2. Eliminare l'intero contenuto del file di progetto.

  3. Copiare e incollare il codice XML seguente e salvare il file.

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

Configurare i pacchetti NuGet e le dipendenze

Quando è stata eseguita la migrazione dei progetti ContosoExpenses.Core e ContosoExpenses.Data nelle sezioni precedenti, i riferimenti al pacchetto NuGet sono stati rimossi dai progetti. In questa sezione verranno aggiunti di nuovo questi riferimenti.

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

  1. Nel progetto ContosoExpenses.Data, espandere il nodo Dipendenze. Si noti che la sezione NuGet è mancante.

    pacchetti NuGet

    Se si apre il Packages.config in Esplora Soluzioni , si troveranno i riferimenti "vecchi" dei pacchetti NuGet usati nel progetto quando utilizzava il .NET Framework completo.

    dipendenze e pacchetti

    Ecco il contenuto del file Packages.config . Si noterà che tutti i pacchetti NuGet sono destinati alla versione completa di .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. Nel progetto ContosoExpenses.Data, eliminare il file Packages.config.

  3. Nel progetto ContosoExpenses.Data fare clic con il pulsante destro del mouse sul nodo dipendenze e scegliere Gestisci pacchetti NuGet.

Gestisci pacchetti NuGet...

  1. Nella finestra Gestore pacchetti NuGet, fare clic su Sfoglia. Cercare il Bogus pacchetto e installare la versione stabile più recente.

    pacchetto NuGet Bogus

  2. Cercare il LiteDB pacchetto e installare la versione stabile più recente.

    pacchetto LiteDB NuGet

    Ci si potrebbe chiedere dove sono archiviati questi elenchi di pacchetti NuGet, poiché il progetto non ha più un file packages.config. I pacchetti NuGet a cui si fa riferimento vengono archiviati direttamente nel file con estensione csproj. È possibile verificarne il contenuto visualizzando il contenuto del file di progetto ContosoExpenses.Data.csproj in un editor di testo. Alla fine del file sono disponibili le righe seguenti:

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

    Annotazioni

    È anche possibile notare che si stanno installando gli stessi pacchetti per questo progetto .NET Core 3 come quelli usati dai progetti .NET Framework 4.7.2. I pacchetti NuGet supportano il multitargeting. Gli autori di librerie possono includere versioni diverse di una libreria nello stesso pacchetto, compilate per architetture e piattaforme diverse. Questi pacchetti supportano .NET Framework completo e .NET Standard 2.0, compatibile con i progetti .NET Core 3. Per altre informazioni sulle differenze tra .NET Framework, .NET Core e .NET Standard, vedere .NET Standard.

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

  1. Nel progetto ContosoExpenses.Core aprire il file packages.config . Si noti che attualmente contiene i seguenti riferimenti che si riferiscono 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 vedrai le versioni .NET Standard dei pacchetti MvvmLightLibs e Unity. Le altre due sono dipendenze scaricate automaticamente da NuGet quando si installano queste due librerie.

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

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

  4. Nella finestra Gestore pacchetti NuGet, fare clic su Sfoglia. Cercare il Unity pacchetto e installare la versione stabile più recente.

    pacchetto Unity

  5. Cercare il MvvmLightLibsStd10 pacchetto e installare la versione stabile più recente. Questa è la versione .NET Standard del MvvmLightLibs pacchetto. Per questo pacchetto, l'autore ha scelto di creare il pacchetto della versione .NET Standard della libreria in un pacchetto separato rispetto alla versione di .NET Framework.

    pacchetto MvvmLightsLibs

  6. Nel progetto ContosoExpenses.Core, fare clic con il pulsante destro del mouse sul nodo dipendenze e scegliere Aggiungi riferimento.

  7. Nella categoria Progetti > Soluzioni, selezionare ContosoExpenses.Data e fare clic su OK.

    Aggiungi di riferimento

Disabilitare gli attributi di assembly generati automaticamente

A questo punto del processo di migrazione, se si tenta di compilare il progetto ContosoExpenses.Core , verranno visualizzati alcuni errori.

nuovi errori di build di .NET Core 3

Questo problema si verifica perché il nuovo formato con estensione csproj introdotto con .NET Core 3.0 archivia le informazioni sull'assembly nel file di progetto anziché nel file AssemblyInfo.cs . Per correggere questi errori, disabilitare questo comportamento e consentire al progetto di continuare a usare il file di AssemblyInfo.cs .

  1. In Visual Studio fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Scarica progetto. Fare di nuovo clic con il pulsante destro del mouse sul progetto e scegliere Modifica ContosoExpenses.Core.csproj.

  2. Aggiungere il seguente elemento nella sezione PropertyGroup e salvare 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. Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Ricarica progetto.

  4. Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegliere Unload Project. Fare di nuovo clic con il pulsante destro del mouse sul progetto e scegliere 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. Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data e scegliere Ricarica il progetto.

Aggiungere il Windows Compatibility Pack

Se si tenta ora di compilare i progetti ContosoExpenses.Core e ContosoExpenses.Data , si noterà che gli errori precedenti sono stati corretti, ma nella libreria ContosoExpenses.Data sono ancora presenti errori simili a questi.

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 di solo Windows.

Per risolvere questi errori, installare il pacchetto NuGet di compatibilità di Windows . 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 di questo pacchetto, ma continuerà a supportare .NET Standard.

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

  2. Scegliere Gestisci pacchetti NuGet.

  3. Nella finestra Gestore pacchetti NuGet, fare clic su Sfoglia. Cercare il Microsoft.Windows.Compatibility pacchetto e installare la versione stabile più recente.

    Installare il pacchetto NuGet

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

Testare ed eseguire il debug della migrazione

Dopo aver compilato correttamente i progetti, è possibile eseguire e testare l'app per verificare se sono presenti errori di runtime.

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

  2. Premere F5 per avviare il progetto ContosoExpenses.Core nel debugger. Verrà visualizzata un'eccezione simile alla seguente.

    Eccezione visualizzata in Visual Studio

    Questa eccezione viene generata perché, quando all'inizio della migrazione è stato eliminato il contenuto del file .csproj, sono state rimosse le informazioni sull'azione di compilazione per i file di immagine. La procedura seguente consente di risolvere questo problema.

  3. Arresta il debugger.

  4. Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Scarica il progetto. Fare di nuovo clic con il pulsante destro del mouse sul progetto e scegliere Modifica ContosoExpenses.Core.csproj.

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

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

  7. Per assegnare la Contoso.ico all'app, fare clic con il tasto destro del mouse sul progetto ContosoExpenses.Core e scegliere Proprietà. Nella pagina aperta, clicca sull'elenco a discesa sotto e seleziona Images\contoso.ico.

    icona Contoso nelle Proprietà del progetto

  8. Fare clic su Salva.

  9. Premere F5 per avviare il progetto ContosoExpenses.Core nel debugger. Verificare che l'app sia ora in esecuzione.

Passaggi successivi

A questo punto dell'esercitazione è stata eseguita la migrazione dell'app Contoso Expenses a .NET Core 3. Ora sei pronto per Parte 2: Aggiungere un controllo UWP InkCanvas tramite XAML Islands.

Annotazioni

Se hai uno schermo ad alta risoluzione, potresti notare che l'app sembra molto piccola. Questo problema verrà affrontato nel passaggio successivo dell'esercitazione.