Condividi tramite


Aggiornare manualmente un'app Xamarin.Forms a un'app .NET maUI multiprogetto

L'aggiornamento di un'app multiprogetto Xamarin.Forms a un'app .NET multipiattaforma (.NET MAUI) segue gli stessi passaggi di un progetto Xamarin.Android e Xamarin.iOS, con passaggi aggiuntivi per sfruttare le modifiche apportate a .NET MAUI.

Questo articolo descrive come eseguire manualmente la migrazione di un Xamarin.Forms progetto di libreria a un progetto di libreria MAUI .NET. Prima di eseguire questa operazione, è necessario aggiornare i Xamarin.Forms progetti della piattaforma in modo che siano progetti in stile SDK. I progetti in stile SDK sono lo stesso formato di progetto usato da tutti i carichi di lavoro .NET e rispetto a molti progetti Xamarin sono molto meno dettagliato. Per informazioni sull'aggiornamento dei progetti di app, vedere Aggiornare progetti Xamarin.Android, Xamarin.iOS e Xamarin.Mac a progetti .NET, migrazione del progetto Xamarin.Android, migrazione del progetto Xamarin Apple e Xamarin.Forms migrazione del progetto UWP.

Per eseguire la migrazione di un Xamarin.Forms progetto di libreria a un progetto di libreria MAUI .NET, è necessario:

  • Aggiornare l'app Xamarin.Forms per usare Xamarin.Forms 5.
  • Aggiornare le dipendenze dell'app alle versioni più recenti.
  • Assicurarsi che l'app funzioni ancora.
  • Aggiornare il file di progetto in modo che sia in stile SDK.
  • Aggiornare gli spazi dei nomi.
  • Risolvere eventuali modifiche all'API.
  • Configurare .NET MAUI.
  • Aggiornare o sostituire dipendenze incompatibili con le versioni di .NET 8.
  • Compilare e testare l'app.

Per semplificare il processo di aggiornamento, è necessario creare un nuovo progetto di libreria MAUI .NET con lo stesso nome del Xamarin.Forms progetto di libreria e quindi copiare il codice, la configurazione e le risorse. Questo è l'approccio descritto di seguito.

Aggiornare l'app Xamarin.Forms

Prima di aggiornare l'app Xamarin.Forms a .NET MAUI, è necessario aggiornare Xamarin.Forms l'app per usare Xamarin.Forms 5 e assicurarsi che funzioni ancora correttamente. È anche necessario aggiornare le dipendenze usate dall'app alle versioni più recenti.

Ciò consentirà di semplificare il resto del processo di migrazione, in quanto ridurrà al minimo le differenze api tra Xamarin.Forms e .NET MAUI e garantirà l'uso di versioni compatibili con .NET delle dipendenze, se presenti.

Crea un nuovo progetto

In Visual Studio creare un nuovo progetto di libreria di classi MAUI .NET con lo stesso nome del Xamarin.Forms progetto di libreria. Questo progetto ospiterà il codice dal Xamarin.Forms progetto di libreria. L'apertura del file di progetto consentirà di verificare di avere un progetto di tipo .NET SDK:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
        <TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
        <!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
        <!-- <TargetFrameworks>$(TargetFrameworks);net8.0-tizen</TargetFrameworks> -->
        <UseMaui>true</UseMaui>
        <SingleProject>true</SingleProject>
        <ImplicitUsings>enable</ImplicitUsings>

        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
        <TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
        <SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
    </PropertyGroup>

</Project>

Nei progetti della piattaforma aggiungere un riferimento a questo nuovo progetto di libreria. Copiare quindi i Xamarin.Forms file di libreria nel progetto di libreria MAUI .NET.

Modifiche dello spazio dei nomi

Gli spazi dei nomi sono stati modificati nel passaggio da Xamarin.Forms a MAUI .NET e Xamarin.Essentials le funzionalità fanno ora parte di .NET MAUI. Per eseguire gli aggiornamenti dello spazio dei nomi, eseguire una ricerca e sostituire per gli spazi dei nomi seguenti:

Spazio dei nomi Xamarin.Forms Spazi dei nomi MAUI .NET
Xamarin.Forms Microsoft.Maui e Microsoft.Maui.Controls
Xamarin.Forms.DualScreen Microsoft.Maui.Controls.Foldable
Xamarin.Forms.Maps Microsoft.Maui.Controls.Maps e Microsoft.Maui.Maps
Xamarin.Forms.PlatformConfiguration Microsoft.Maui.Controls.PlatformConfiguration
Xamarin.Forms.PlatformConfiguration.AndroidSpecific Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific
Xamarin.Forms.PlatformConfiguration.AndroidSpecific.AppCompat Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat
Xamarin.Forms.PlatformConfiguration.TizenSpecific Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific
Xamarin.Forms.PlatformConfiguration.WindowsSpecific Microsoft.Maui.Controls.PlatformConfiguration.WindowsSpecific
Xamarin.Forms.PlatformConfiguration.iOSSpecific Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific
Xamarin.Forms.Shapes Microsoft.Maui.Controls.Shapes
Xamarin.Forms.StyleSheets Microsoft.Maui.Controls.StyleSheets
Xamarin.Forms.Xaml Microsoft.Maui.Controls.Xaml

I progetti MAUI .NET usano direttive implicite global using . Questa funzionalità consente di rimuovere using le direttive per lo Xamarin.Essentials spazio dei nomi, senza doverle sostituire con gli spazi dei nomi MAUI .NET equivalenti.

Inoltre, lo spazio dei nomi XAML predefinito è passato da http://xamarin.com/schemas/2014/forms in Xamarin.Forms a http://schemas.microsoft.com/dotnet/2021/maui in .NET MAUI. Pertanto, è necessario sostituire tutte le occorrenze di xmlns="http://xamarin.com/schemas/2014/forms" con xmlns="http://schemas.microsoft.com/dotnet/2021/maui".

Nota

È possibile aggiornare Xamarin.Forms rapidamente gli spazi dei nomi in Microsoft.Maui usando azioni rapide in Visual Studio, purché sia installato Upgrade Assistant .

Modifiche API

Alcune API sono state modificate nel passaggio da Xamarin.Forms a MAUI .NET. Si tratta di diversi motivi, tra cui la rimozione di funzionalità duplicate causate dal Xamarin.Essentials fatto che fa parte di .NET MAUI e garantisce che le API seguano le linee guida per la denominazione .NET. Le sezioni seguenti illustrano queste modifiche.

Modifiche al colore

In Xamarin.Formslo Xamarin.Forms.Color struct consente di costruire Color oggetti usando double valori e di specificare colori denominati, ad esempio Xamarin.Forms.Color.AliceBlue. In .NET MAUI questa funzionalità è stata separata nella Microsoft.Maui.Graphics.Color classe e nella Microsoft.Maui.Graphics.Colors classe .

La Microsoft.Maui.Graphics.Color classe, nello spazio dei Microsoft.Maui.Graphics nomi , consente di costruire Color oggetti usando float valori, byte valori e int valori. La Microsoft.Maui.Graphics.Colors classe , che è anche nello spazio dei Microsoft.Maui.Graphics nomi , in gran parte fornisce gli stessi colori denominati. Ad esempio, usare Colors.AliceBlue per specificare il AliceBlue colore.

La tabella seguente illustra le modifiche dell'API tra lo Xamarin.Forms.Color struct e la Microsoft.Maui.Graphics.Color classe :

Xamarin.FormsAPI API MAUI .NET Commento
Xamarin.Forms.Color.R Microsoft.Maui.Graphics.Color.Red
Xamarin.Forms.Color.G Microsoft.Maui.Graphics.Color.Green
Xamarin.Forms.Color.B Microsoft.Maui.Graphics.Color.Blue
Xamarin.Forms.Color.A Microsoft.Maui.Graphics.Color.Alpha
Xamarin.Forms.Color.Hue Microsoft.Maui.Graphics.Color.GetHue Xamarin.Forms la proprietà sostituita con un metodo in .NET MAUI.
Xamarin.Forms.Color.Saturation Microsoft.Maui.Graphics.Color.GetSaturation Xamarin.Forms la proprietà sostituita con un metodo in .NET MAUI.
Xamarin.Forms.Color.Luminosity Microsoft.Maui.Graphics.Color.GetLuminosity Xamarin.Forms la proprietà sostituita con un metodo in .NET MAUI.
Xamarin.Forms.Color.Default Nessun equivalente di .NET MAUI. Per impostazione predefinita, invece, Microsoft.Maui.Graphics.Color gli oggetti sono null.
Xamarin.Forms.Color.Accent Nessun equivalente di .NET MAUI.
Xamarin.Forms.Color.FromHex Microsoft.Maui.Graphics.Color.FromArgb Microsoft.Maui.Graphics.Color.FromHex è obsoleto e verrà rimosso in una versione futura.

Inoltre, tutti i valori numerici in un Microsoft.Maui.Graphics.Color sono , anziché double come usato in Xamarin.Forms.Colorfloat.

Nota

A differenza di Xamarin.Forms, un Microsoft.Maui.Graphics.Color oggetto non ha una conversione implicita in System.Drawing.Color.

Modifiche al layout

La tabella seguente elenca le API di layout che sono state rimosse nel passaggio da Xamarin.Forms a .NET MAUI:

Xamarin.FormsAPI API MAUI .NET Commenti
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add L'overload Add che accetta 3 argomenti non è presente in .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal Nessun equivalente di .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.AddVertical Nessun equivalente di .NET MAUI.
Xamarin.Forms.RelativeLayout Microsoft.Maui.Controls.Compatibility.RelativeLayout In .NET MAUI RelativeLayout esiste solo come controllo di compatibilità per gli utenti che eseguono la migrazione da Xamarin.Forms. Usare Grid invece o aggiungere per xmlns lo spazio dei nomi di compatibilità.

Inoltre, l'aggiunta di elementi figlio a un layout nel codice in Xamarin.Forms viene eseguita aggiungendo gli elementi figlio alla raccolta del Children layout:

Grid grid = new Grid();
grid.Children.Add(new Label { Text = "Hello world" });

In .NET MAUI la Children raccolta è destinata all'uso interno di .NET MAUI e non deve essere modificata direttamente. Pertanto, negli elementi figlio di codice deve essere aggiunto direttamente al layout:

Grid grid = new Grid();
grid.Add(new Label { Text = "Hello world" });

Importante

Tutti i Add metodi di estensione del layout, ad esempio GridExtensions.Add, vengono richiamati Children nel layout anziché nella raccolta di layout.

Quando si esegue l'app .NET MAUI aggiornata, è possibile notare che il comportamento del layout è diverso. Per altre informazioni, vedere Modifiche al comportamento del layout da Xamarin.Forms.

Modifiche di layout personalizzate

Il processo di creazione di un layout personalizzato in Xamarin.Forms comporta la creazione di una classe che deriva da Layout<View>e l'override dei VisualElement.OnMeasure metodi e Layout.LayoutChildren . Per altre informazioni, vedere Creare un layout personalizzato in Xamarin.Forms.

In .NET MAUI le classi di layout derivano dalla classe astratta Layout . Questa classe delega il layout e la misurazione multipiattaforma a una classe di gestione layout. Ogni classe di gestione layout implementa l'interfaccia ILayoutManager , che specifica che Measure e ArrangeChildren le implementazioni devono essere fornite:

  • L'implementazione Measure chiama IView.Measure in ogni visualizzazione del layout e restituisce le dimensioni totali del layout in base ai vincoli.
  • L'implementazione ArrangeChildren determina la posizione di ogni visualizzazione all'interno dei limiti del layout e le chiamate Arrange a ogni visualizzazione con i limiti appropriati. Il valore restituito è la dimensione effettiva del layout.

Per altre informazioni, vedere Layout personalizzati.

Modifiche del dispositivo

Xamarin.Forms ha una Xamarin.Forms.Device classe che consente di interagire con il dispositivo e la piattaforma in cui è in esecuzione l'app. La classe equivalente in .NET MAUI, Microsoft.Maui.Controls.Device, è deprecata e la relativa funzionalità viene sostituita da più tipi.

La tabella seguente illustra le sostituzioni MAUI di .NET per la funzionalità nella Xamarin.Forms.Device classe :

Xamarin.FormsAPI API MAUI .NET Commenti
Xamarin.Forms.Device.Android Microsoft.Maui.Devices.DevicePlatform.Android
Xamarin.Forms.Device.iOS Microsoft.Maui.Devices.DevicePlatform.iOS
Xamarin.Forms.Device.GTK Nessun equivalente di .NET MAUI.
Xamarin.Forms.Device.macOS Nessun equivalente di .NET MAUI. Usare invece Microsoft.Maui.Devices.DevicePlatform.MacCatalyst.
Xamarin.Forms.Device.Tizen Microsoft.Maui.Devices.DevicePlatform.Tizen
Xamarin.Forms.Device.UWP Microsoft.Maui.Devices.DevicePlatform.WinUI
Xamarin.Forms.Device.WPF Nessun equivalente di .NET MAUI.
Xamarin.Forms.Device.Flags Nessun equivalente di .NET MAUI.
Xamarin.Forms.Device.FlowDirection Microsoft.Maui.ApplicationModel.AppInfo.RequestedLayoutDirection
Xamarin.Forms.Device.Idiom Microsoft.Maui.Devices.DeviceInfo.Idiom
Xamarin.Forms.Device.IsInvokeRequired Microsoft.Maui.Dispatching.Dispatcher.IsDispatchRequired
Xamarin.Forms.Device.OS Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.RuntimePlatform Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.BeginInvokeOnMainThread Microsoft.Maui.ApplicationModel.MainThread.BeginInvokeOnMainThread
Xamarin.Forms.Device.GetMainThreadSynchronizationContextAsync Microsoft.Maui.ApplicationModel.MainThread.GetMainThreadSynchronizationContextAsync
Xamarin.Forms.Device.GetNamedColor Nessun equivalente di .NET MAUI.
Xamarin.Forms.Device.GetNamedSize Nessun equivalente di .NET MAUI.
Xamarin.Forms.Device.Invalidate Microsoft.Maui.Controls.VisualElement.InvalidateMeasure
Xamarin.Forms.Device.InvokeOnMainThreadAsync Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync
Xamarin.Forms.Device.OnPlatform Microsoft.Maui.Devices.DeviceInfo.Platform
Xamarin.Forms.Device.OpenUri Microsoft.Maui.ApplicationModel.Launcher.OpenAsync
Xamarin.Forms.Device.SetFlags Nessun equivalente di .NET MAUI.
Xamarin.Forms.Device.SetFlowDirection Microsoft.Maui.Controls.Window.FlowDirection
Xamarin.Forms.Device.StartTimer Microsoft.Maui.Dispatching.DispatcherExtensions.StartTimer oppure Microsoft.Maui.Dispatching.Dispatcher.DispatchDelayed

Modifiche mappa

In Xamarin.Formsil controllo e i Map tipi associati si trovano nello spazio dei Xamarin.Forms.Maps nomi . In .NET MAUI questa funzionalità è stata spostata negli Microsoft.Maui.Controls.Maps spazi dei nomi e Microsoft.Maui.Maps . Alcune proprietà sono state rinominate e alcuni tipi sono stati sostituiti con tipi equivalenti da Xamarin.Essentials.

La tabella seguente illustra le sostituzioni MAUI di .NET per la funzionalità nello spazio dei Xamarin.Forms.Maps nomi :

Xamarin.FormsAPI API MAUI .NET Commento
Xamarin.Forms.Maps.Map.HasScrollEnabled Microsoft.Maui.Controls.Maps.Map.IsScrollEnabled
Xamarin.Forms.Maps.Map.HasZoomEnabled Microsoft.Maui.Controls.Maps.Map.IsZoomEnabled
Xamarin.Forms.Maps.Map.TrafficEnabled Microsoft.Maui.Controls.Maps.Map.IsTrafficEnabled
Xamarin.Forms.Maps.Map.MoveToLastRegionOnLayoutChange Nessun equivalente di .NET MAUI.
Xamarin.Forms.Maps.Pin.Id Microsoft.Maui.Controls.Maps.Pin.MarkerId
Xamarin.Forms.Maps.Pin.Position Microsoft.Maui.Controls.Maps.Pin.Location
Xamarin.Forms.Maps.MapClickedEventArgs.Position Microsoft.Maui.Controls.Maps.MapClickedEventArgs.Location
Xamarin.Forms.Maps.Position Microsoft.Maui.Devices.Sensors.Location I membri di tipo Xamarin.Forms.Maps.Position sono stati modificati nel Microsoft.Maui.Devices.Sensors.Location tipo .
Xamarin.Forms.Maps.Geocoder Microsoft.Maui.Devices.Sensors.Geocoding I membri di tipo Xamarin.Forms.Maps.Geocoder sono stati modificati nel Microsoft.Maui.Devices.Sensors.Geocoding tipo .

.NET MAUI ha due Map tipi: Microsoft.Maui.Controls.Maps.Map e Microsoft.Maui.ApplicationModel.Map. Poiché lo Microsoft.Maui.ApplicationModel spazio dei nomi è una delle direttive MAUI di global using .NET, quando si usa il Microsoft.Maui.Controls.Maps.Map controllo dal codice è necessario qualificare Map completamente l'utilizzo o usare un alias using.

In XAML è necessario aggiungere una xmlns definizione dello spazio dei nomi per il Map controllo . Anche se non è necessario, impedisce una collisione tra i Polygon tipi e Polyline , che esistono sia negli spazi dei Microsoft.Maui.Controls.Maps Microsoft.Maui.Controls.Shapes nomi che negli spazi dei nomi . Per altre informazioni, vedere Visualizzare una mappa.

Altre modifiche

Un numero ridotto di altre API è stato consolidato nel passaggio da Xamarin.Forms a .NET MAUI. La tabella seguente mostra queste modifiche:

Xamarin.FormsAPI API MAUI .NET Commenti
Xamarin.Forms.Application.Properties Microsoft.Maui.Storage.Preferences
Xamarin.Forms.Button.Image Microsoft.Maui.Controls.Button.ImageSource
Xamarin.Forms.Frame.OutlineColor Microsoft.Maui.Controls.Frame.BorderColor
Xamarin.Forms.IQueryAttributable.ApplyQueryAttributes Microsoft.Maui.Controls.IQueryAttributable.ApplyQueryAttributes In Xamarin.Formsil ApplyQueryAttributes metodo accetta un IDictionary<string, string> argomento. In .NET MAUI il ApplyQueryAttributes metodo accetta un IDictionary<string, object> argomento.
Xamarin.Forms.MenuItem.Icon Microsoft.Maui.Controls.MenuItem.IconImageSource Xamarin.Forms.MenuItem.Icon è la classe di base per Xamarin.Forms.ToolbarIteme quindi ToolbarItem.Icon diventa ToolbarItem.IconImageSource.
Xamarin.Forms.OrientationStateTrigger.Orientation Microsoft.Maui.Controls.OrientationStateTrigger.Orientation In Xamarin.Formsla OrientationStateTrigger.Orientation proprietà è di tipo Xamarin.Forms.Internals.DeviceOrientation. In .NET MAUI la OrientationStateTrigger.Orientation proprietà è di tipo DisplayOrientation.
Xamarin.Forms.OSAppTheme Microsoft.Maui.ApplicationModel.AppTheme
Xamarin.Forms.Span.ForegroundColor Microsoft.Maui.Controls.Span.TextColor
Xamarin.Forms.ToolbarItem.Name Microsoft.Maui.Controls.MenuItem.Text Microsoft.Maui.Controls.MenuItem.Text è la classe di base per Microsoft.Maui.Controls.ToolbarIteme quindi ToolbarItem.Name diventa ToolbarItem.Text.

Inoltre, in Xamarin.Forms, l'override Page.OnAppearing viene chiamato in Android quando un'app è in background e quindi viene portata in primo piano. Tuttavia, questa sostituzione non viene chiamata in iOS e Windows nello stesso scenario. In .NET MAUI l'override OnAppearing() non viene chiamato in alcuna piattaforma quando un'app è in background e quindi viene portata in primo piano. È invece necessario restare in ascolto degli eventi del ciclo di vita su cui Window ricevere una notifica quando un'app torna in primo piano. Per altre informazioni, vedere Finestre MAUI .NET.

Modifiche ai moduli nativi

I moduli nativi in Xamarin.Forms sono diventati l'incorporamento nativo in .NET MAUI e usano un approccio di inizializzazione e metodi di estensione diversi per convertire i controlli multipiattaforma nei tipi nativi. Per altre informazioni, vedere Incorporamento nativo.

Eseguire il bootstrap dell'app migrata

Quando si aggiorna manualmente un'app Xamarin.Forms a .NET MAUI, è necessario abilitare il supporto MAUI .NET in ogni progetto di piattaforma, aggiornare la classe del punto di ingresso di ogni progetto di piattaforma e quindi configurare il bootstrap dell'app MAUI .NET.

Abilitare .NET MAUI nei progetti della piattaforma

Prima di aggiornare la classe del punto di ingresso di ogni progetto di piattaforma, è necessario abilitare il supporto di .NET MAUI. A tale scopo, impostare la proprietà di $(UseMaui) compilazione su true in ogni progetto di piattaforma:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <UseMaui>true</UseMaui>
  </PropertyGroup>
</Project>

Importante

È necessario aggiungere <UseMaui>true</UseMaui> al file di progetto per abilitare il supporto DI MAUI .NET. Assicurarsi inoltre di aver aggiunto <EnableDefaultMauiItems>false</EnableDefaultMauiItems> al file di progetto WinUI. In questo modo si interrompe la ricezione di errori di compilazione relativi al InitializeComponent metodo già definito.

Aggiungere riferimenti ai pacchetti

In .NET 8, .NET MAUI viene fornito come carico di lavoro .NET e più pacchetti NuGet. Il vantaggio di questo approccio è che consente di aggiungere facilmente i progetti a versioni specifiche, consentendo allo stesso tempo di visualizzare facilmente l'anteprima di build non definitive o sperimentali.

È consigliabile aggiungere i seguenti riferimenti espliciti al pacchetto in un <ItemGroup> in ogni file di progetto:

<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />

Viene $(MauiVersion) fatto riferimento alla variabile dalla versione di .NET MAUI installata. È possibile eseguire l'override di questa operazione aggiungendo la proprietà di $(MauiVersion) compilazione a ogni file di progetto:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <UseMaui>True</UseMaui>
        <MauiVersion>8.0.3</MauiVersion>
    </PropertyGroup>
</Project>

Configurazione del progetto Android

Nel progetto .NET MAUI Android aggiornare la MainApplication classe in modo che corrisponda al codice seguente:

using System;
using Android.App;
using Android.Runtime;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using YOUR_MAUI_CLASS_LIB_HERE;

namespace YOUR_NAMESPACE_HERE.Droid
{
    [Application]
    public class MainApplication : MauiApplication
    {
        public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership)
        {
        }

        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}

Aggiornare anche la MainActivity classe per ereditare da MauiAppCompatActivity:

using System;
using Microsoft.Maui;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;

namespace YOUR_NAMESPACE_HERE.Droid
{
    [Activity(Label = "MyTitle", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
    public class MainActivity : MauiAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }
    }
}

Aggiornare quindi il file manifesto per specificare che minSdKVersion è 21, ovvero la versione minima di Android SDK richiesta da .NET MAUI. A tale scopo, è possibile modificare il <uses-sdk /> nodo, che è un elemento figlio del <manifest> nodo:

<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="32" />

Configurazione del progetto iOS

Nel progetto .NET MAUI iOS aggiornare la AppDelegate classe in modo che erediti da MauiUIApplicationDelegate:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Maui;
using Foundation;
using UIKit;
using YOUR_MAUI_CLASS_LIB_HERE;

namespace YOUR_NAMESPACE_HERE.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : MauiUIApplicationDelegate
    {
        protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
    }
}

Aggiornare quindi Info.plist in modo che MinimumOSVersion sia 11.0, ovvero la versione minima di iOS richiesta da .NET MAUI.

Configurazione del progetto UWP

Nel progetto .NET MAUI WinUI 3 aggiornare App.xaml in modo che corrisponda al codice seguente:

<?xml version="1.0" encoding="utf-8"?>
<maui:MauiWinUIApplication
    x:Class="YOUR_NAMESPACE_HERE.WinUI.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:maui="using:Microsoft.Maui"
    xmlns:local="using:YOUR_NAMESPACE_HERE.WinUI">
    <maui:MauiWinUIApplication.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
                <!-- Other merged dictionaries here -->
            </ResourceDictionary.MergedDictionaries>
            <!-- Other app resources here -->
        </ResourceDictionary>
    </maui:MauiWinUIApplication.Resources>
</maui:MauiWinUIApplication>

Nota

Se il progetto include risorse nel file App.xaml esistente, è necessario eseguirne la migrazione alla nuova versione del file.

Aggiornare anche App.xaml.cs in modo che corrisponda al codice seguente:

using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using YOUR_MAUI_CLASS_LIB_HERE;

namespace YOUR_NAMESPACE_HERE.WinUI;

public partial class App : MauiWinUIApplication
{
    public App()
    {
        InitializeComponent();
    }

    protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

Nota

Se il progetto include la logica di business in App.xaml.cs è necessario eseguire la migrazione di tale logica alla nuova versione del file.

Aggiungere quindi un file launchSettings.json alla cartella Properties del progetto e aggiungere il codice JSON seguente al file:

{
  "profiles": {
    "Windows Machine": {
      "commandName": "MsixPackage",
      "nativeDebugging": true
    }
  }
}

Punto di ingresso app

Le app MAUI .NET hanno un singolo punto di ingresso per app multipiattaforma. Ogni punto di ingresso della piattaforma chiama un CreateMauiApp metodo nella classe statica MauiProgram e restituisce un oggetto MauiApp.

Aggiungere quindi una nuova classe denominata MauiProgram contenente il codice seguente:

namespace YOUR_NAMESPACE_HERE;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>();

        return builder.Build();
    }
}

Nota

Per Xamarin.Forms i progetti UWP, il App riferimento in builder.UseMauiApp<App>() è disponibile nel file MainPage.xaml.cs .

Se sono presenti servizi specifici della piattaforma di cui è necessario eseguire la migrazione a .NET MAUI, usare il AddTransient(IServiceCollection, Type) metodo per aggiungere un servizio temporaneo del tipo specificato all'oggetto specificato IServiceCollection.

Nota

È possibile aggiornare Xamarin.Forms rapidamente gli spazi dei nomi in Microsoft.Maui usando azioni rapide in Visual Studio, purché sia installato Upgrade Assistant .

Modifiche di AssemblyInfo

Le proprietà in genere impostate in un file AssemblyInfo.cs sono ora disponibili nel progetto in stile SDK. È consigliabile eseguirne la migrazione da AssemblyInfo.cs al file di progetto in ogni progetto e rimuovere il file AssemblyInfo.cs .

Facoltativamente, è possibile mantenere il file AssemblyInfo.cs e impostare la GenerateAssemblyInfo proprietà nel file di progetto su false:

<PropertyGroup>
  <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

Per altre informazioni sulla GenerateAssemblyInfo proprietà, vedere GenerateAssemblyInfo.

Aggiornare le dipendenze delle app

In genere, Xamarin.Forms i pacchetti NuGet non sono compatibili con .NET 8 a meno che non siano stati ricompilati usando moniker del framework di destinazione .NET (TFMS). Tuttavia, le app Android possono usare pacchetti NuGet destinati ai monoandroid framework e monoandroidXX.X .

È possibile verificare che un pacchetto sia compatibile con .NET 8 esaminando la scheda Framework in NuGet per il pacchetto in uso e verificando che elenca uno dei framework compatibili illustrati nella tabella seguente:

Framework compatibili Framework incompatibili
net8.0-android, monoandroid, monoandroidXX.X
net8.0-ios monotouch, xamarinios, xamarinios10
net8.0-macos monomac, xamarinmac, xamarinmac20
net8.0-tvos xamarintvos
xamarinwatchos

Nota

Le librerie .NET Standard che non hanno dipendenze dai framework incompatibili elencati in precedenza sono ancora compatibili con .NET 8.

Se un pacchetto in NuGet indica la compatibilità con uno dei framework compatibili precedenti, indipendentemente dall'inclusione anche di framework incompatibili, il pacchetto è compatibile. I pacchetti NuGet compatibili possono essere aggiunti al progetto di libreria MAUI .NET usando gestione pacchetti NuGet in Visual Studio.

Se non è possibile trovare una versione compatibile con .NET 8 di un pacchetto NuGet, è necessario:

  • Ricompilare il pacchetto con i TFM .NET, se si è proprietari del codice.
  • Cercare una versione di anteprima di una versione .NET 8 del pacchetto.
  • Sostituire la dipendenza con un'alternativa compatibile con .NET 8.

Compilare e risolvere i problemi

Dopo aver risolto le dipendenze, è necessario compilare il progetto. Eventuali errori ti guideranno verso i passaggi successivi.

Suggerimento

  • Eliminare tutte le cartelle bin e obj da tutti i progetti prima di aprire e compilare progetti in Visual Studio, in particolare quando si modificano le versioni di .NET.
  • Eliminare il Resource.designer.cs file generato dal progetto Android.

La tabella seguente fornisce indicazioni per il superamento dei problemi comuni di compilazione o runtime:

Problema Suggerimento
Xamarin.* lo spazio dei nomi non esiste. Aggiornare lo spazio dei nomi al relativo equivalente MAUI .NET. Per altre informazioni, vedere Modifiche dello spazio dei nomi.
L'API non esiste. Aggiornare l'utilizzo dell'API all'equivalente MAUI .NET. Per altre informazioni, vedere Modifiche all'API.
L'app non verrà distribuita. Assicurarsi che il progetto di piattaforma richiesto sia impostato per la distribuzione in Configuration Manager di Visual Studio.
L'app non verrà avviata. Aggiornare la classe del punto di ingresso di ogni progetto della piattaforma e il punto di ingresso dell'app. Per altre informazioni, vedere Bootstrap dell'app migrata.
CollectionView non scorre. Controllare il layout del contenitore e le dimensioni misurate di CollectionView. Per impostazione predefinita, il controllo occupa lo spazio consentito dal contenitore. Un Grid vincolo vincola gli elementi figlio alle proprie dimensioni. Tuttavia, un StackLayout consente agli elementi figlio di occupare spazio oltre i limiti.
Il popup viene visualizzato nella pagina in iOS. In Xamarin.Formstutti i popup in iOS sono UIWindow istanze, ma nei popup .NET MAUI vengono visualizzati individuando la presentazione ViewController corrente e visualizzando il popup con PresentViewControllerAsync. Nei plug-in, ad esempio Mopups, per assicurarsi che i popup siano visualizzati correttamente, è necessario chiamare DisplayAlert, DisplayActionSheeto DisplayPromptAsync dall'oggetto ContentPage usato all'interno del Mopup popup.
BoxView non appare. La dimensione predefinita di in BoxView Xamarin.Forms è 40x40. Le dimensioni predefinite di un BoxView oggetto in .NET MAUI sono 0x0. Impostare WidthRequest e HeightRequest su 40.
Il layout non contiene spaziatura interna, margine o spaziatura. Aggiungere valori predefiniti al progetto in base alla risorsa di stile MAUI .NET. Per altre informazioni, vedere Modifiche del valore predefinito da Xamarin.Forms.
Il layout personalizzato non funziona. Il codice di layout personalizzato deve essere aggiornato per funzionare in .NET MAUI. Per altre informazioni, vedere Modifiche al layout personalizzato.
Il renderer personalizzato non funziona. Il codice renderer deve essere aggiornato per funzionare in .NET MAUI. Per altre informazioni, vedere Usare renderer personalizzati in .NET MAUI.
L'effetto non funziona. Il codice effetto deve essere aggiornato per funzionare in .NET MAUI. Per altre informazioni, vedere Usare gli effetti in .NET MAUI.
SkiaSharp il codice non funziona. SkiaSharp il codice richiede aggiornamenti secondari per funzionare in .NET MAUI. Per altre informazioni, vedere Riutilizzare SkiaSharp il codice in .NET MAUI.
Non è possibile accedere ai dati delle proprietà dell'app creati in precedenza. Eseguire la migrazione dei dati delle proprietà dell'app alle preferenze MAUI .NET. Per altre informazioni, vedere Eseguire la migrazione dei dati dal dizionario delle proprietà dell'app Xamarin.Forms alle preferenze MAUI .NET.
Non è possibile accedere ai dati di archiviazione protetti creati in precedenza. Eseguire la migrazione dei dati di archiviazione sicura a .NET MAUI. Per altre informazioni, vedere Eseguire la migrazione da Xamarin.Essentials una risorsa di archiviazione sicura a una risorsa di archiviazione sicura MAUI .NET.
Non è possibile accedere ai dati di rilevamento delle versioni creati in precedenza. Eseguire la migrazione dei dati di rilevamento della versione a .NET MAUI. Per altre informazioni, vedere Eseguire la migrazione dei dati di rilevamento delle versioni da un'app Xamarin.Forms a un'app MAUI .NET.

Vedi anche