Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
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.
In Esplora file, vai alla cartella C:\WinAppsModernizationWorkshop\Lab\Exercise1\01-Start\ContosoExpenses e crea un nuovo file di testo denominato ContosoExpenses.Core.csproj.
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.
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>
Chiudere il file e tornare alla soluzione ContosoExpenses in Visual Studio.
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:
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.
Eliminare l'intero contenuto del file di progetto.
Copiare e incollare il codice XML seguente e salvare il file.
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> </PropertyGroup> </Project>
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:
Nel progetto ContosoExpenses.Data, espandere il nodo Dipendenze. Si noti che la sezione NuGet è mancante.
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.
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>
Nel progetto ContosoExpenses.Data, eliminare il file Packages.config.
Nel progetto ContosoExpenses.Data fare clic con il pulsante destro del mouse sul nodo dipendenze e scegliere Gestisci pacchetti NuGet.
Nella finestra Gestore pacchetti NuGet, fare clic su Sfoglia. Cercare il
Bogus
pacchetto e installare la versione stabile più recente.pacchetto NuGet Bogus
Cercare il
LiteDB
pacchetto e installare la versione stabile più recente.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:
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
eUnity
. Le altre due sono dipendenze scaricate automaticamente da NuGet quando si installano queste due librerie.Nel progetto ContosoExpenses.Core eliminare il file Packages.config.
Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Gestisci pacchetti NuGet.
Nella finestra Gestore pacchetti NuGet, fare clic su Sfoglia. Cercare il
Unity
pacchetto e installare la versione stabile più recente.Cercare il
MvvmLightLibsStd10
pacchetto e installare la versione stabile più recente. Questa è la versione .NET Standard delMvvmLightLibs
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.Nel progetto ContosoExpenses.Core, fare clic con il pulsante destro del mouse sul nodo dipendenze e scegliere Aggiungi riferimento.
Nella categoria Progetti > Soluzioni, selezionare ContosoExpenses.Data e fare clic su OK.
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.
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 .
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.
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>
Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Ricarica progetto.
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.
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>
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.
Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Data.
Scegliere Gestisci pacchetti NuGet.
Nella finestra Gestore pacchetti NuGet, fare clic su Sfoglia. Cercare il
Microsoft.Windows.Compatibility
pacchetto e installare la versione stabile più recente.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.
Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Imposta come progetto di avvio.
Premere F5 per avviare il progetto ContosoExpenses.Core nel debugger. Verrà visualizzata un'eccezione simile alla seguente.
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.
Arresta il debugger.
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.
Prima della chiusura dell'elemento Project, aggiungi la seguente voce:
<ItemGroup> <Content Include="Images/*"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
Fare clic con il pulsante destro del mouse sul progetto ContosoExpenses.Core e scegliere Ricarica progetto.
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
.Proprietà del progetto
Fare clic su Salva.
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.