Atualizar manualmente um aplicativo para um Xamarin.Forms aplicativo .NET MAUI de vários projetos

A atualização de um aplicativo de vários projetos para um aplicativo de interface do usuário de aplicativo multiplataforma .NET (.NET MAUI) de vários projetos Xamarin.Forms segue as mesmas etapas de um projeto Xamarin.Android e Xamarin.iOS, com etapas adicionais para aproveitar as alterações no .NET MAUI.

Este artigo descreve como migrar manualmente um projeto de biblioteca para um projeto de Xamarin.Forms biblioteca .NET MAUI. Antes de fazer isso, você deve atualizar seus Xamarin.Forms projetos de plataforma para serem projetos no estilo SDK. Projetos no estilo SDK são o mesmo formato de projeto usado por todas as cargas de trabalho do .NET e, em comparação com muitos projetos Xamarin, são muito menos detalhados. Para obter informações sobre como atualizar seus projetos de aplicativo, consulte Atualizar projetos Xamarin.Android, Xamarin.iOS e Xamarin.Mac para .NET, migração de projeto Xamarin.Android, migração de projeto Xamarin Apple e Xamarin.Forms migração de projeto UWP.

Para migrar um projeto de biblioteca para um projeto de Xamarin.Forms biblioteca .NET MAUI, você deve:

  • Atualize seu Xamarin.Forms aplicativo para usar Xamarin.Forms 5.
  • Atualize as dependências do aplicativo para as versões mais recentes.
  • Verifique se o aplicativo ainda funciona.
  • Atualize seu arquivo de projeto para ser no estilo SDK.
  • Atualizar namespaces.
  • Resolva quaisquer alterações de API.
  • Configure .NET MAUI.
  • Atualize ou substitua dependências incompatíveis com versões do .NET 8.
  • Compile e teste seu aplicativo.

Para simplificar o processo de atualização, você deve criar um novo projeto de biblioteca .NET MAUI do mesmo nome que seu projeto de biblioteca e, em seguida, copiar em seu Xamarin.Forms código. Esta é a abordagem descrita abaixo.

Atualizar seu Xamarin.Forms aplicativo

Antes de atualizar seu Xamarin.Forms aplicativo para o .NET MAUI, você deve primeiro atualizá-lo Xamarin.Forms para usar Xamarin.Forms 5 e garantir que ele ainda seja executado corretamente. Além disso, você deve atualizar as dependências que seu aplicativo usa para as versões mais recentes.

Isso ajudará a simplificar o restante do processo de migração, pois minimizará as diferenças de API entre Xamarin.Forms o .NET MAUI e garantirá que você esteja usando versões compatíveis com .NET de suas dependências, se elas existirem.

Crie um novo projeto

No Visual Studio, crie um novo projeto de biblioteca de classes MAUI do .NET com o mesmo nome do seu Xamarin.Forms projeto de biblioteca. Este projeto hospedará o código do seu Xamarin.Forms projeto de biblioteca. Abrir o arquivo de projeto confirmará que você tem um projeto no estilo SDK do .NET:

<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>

Em seus projetos de plataforma, adicione uma referência a esse novo projeto de biblioteca. Em seguida, copie os Xamarin.Forms arquivos de biblioteca para o projeto de biblioteca .NET MAUI.

Alterações de namespace

Os namespaces foram alterados na mudança do .NET MAUI e Xamarin.Essentials os recursos agora fazem parte do Xamarin.Forms .NET MAUI. Para fazer atualizações de namespace, execute uma localização e substitua os seguintes namespaces:

Os projetos .NET MAUI usam diretivas implícitas global using . Esse recurso permite que você remova using diretivas para o Xamarin.Essentials namespace, sem precisar substituí-las pelos namespaces equivalentes do .NET MAUI.

Além disso, o namespace XAML padrão foi alterado de http://xamarin.com/schemas/2014/forms in para in Xamarin.Forms . http://schemas.microsoft.com/dotnet/2021/maui NET MAUI. Portanto, você deve substituir todas as ocorrências de xmlns="http://xamarin.com/schemas/2014/forms" com xmlns="http://schemas.microsoft.com/dotnet/2021/maui".

Alterações de API

Algumas APIs foram alteradas na mudança de Xamarin.Forms para .NET MAUI. Esses são vários motivos, incluindo a remoção da funcionalidade duplicada causada por Xamarin.Essentials se tornar parte do .NET MAUI e garantir que as APIs sigam as diretrizes de nomenclatura do .NET. As seções a seguir discutem essas alterações.

Alterações de cor

No Xamarin.Forms, a Xamarin.Forms.Color struct permite construir Color objetos usando double valores e fornece cores nomeadas, como Xamarin.Forms.Color.AliceBlue. No .NET MAUI, essa funcionalidade foi separada Microsoft.Maui.Graphics.Color na classe e na Microsoft.Maui.Graphics.Colors classe.

A Microsoft.Maui.Graphics.Color classe, no Microsoft.Maui.Graphics namespace, permite construir Color objetos usando float valores, byte valores e int valores. A Microsoft.Maui.Graphics.Colors classe, que também está no Microsoft.Maui.Graphics namespace, fornece em grande parte as mesmas cores nomeadas.

A tabela a seguir mostra as alterações de API entre a struct e a Xamarin.Forms.ColorMicrosoft.Maui.Graphics.Color classe:

Xamarin.Forms API .NET MAUI API Comentário
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 propriedade substituída por um método no .NET MAUI.
Xamarin.Forms.Color.Saturation Microsoft.Maui.Graphics.Color.GetSaturation Xamarin.Forms propriedade substituída por um método no .NET MAUI.
Xamarin.Forms.Color.Luminosity Microsoft.Maui.Graphics.Color.GetLuminosity Xamarin.Forms propriedade substituída por um método no .NET MAUI.
Xamarin.Forms.Color.Default Nenhum .NET MAUI equivalente. Em vez disso, Microsoft.Maui.Graphics.Color os objetos têm como nullpadrão o .
Xamarin.Forms.Color.Accent Nenhum .NET MAUI equivalente.
Xamarin.Forms.Color.FromHex Microsoft.Maui.Graphics.Color.FromArgb Microsoft.Maui.Graphics.Color.FromHex está obsoleto e será removido em uma versão futura.

Além disso, todos os valores numéricos em a Microsoft.Maui.Graphics.Color são , em vez de double como usados em Xamarin.Forms.Colorfloat.

Observação

Ao contrário Xamarin.Formsdo , a Microsoft.Maui.Graphics.Color não tem uma conversão implícita para System.Drawing.Color.

Alterações de layout

A tabela a seguir lista as APIs de layout que foram removidas na mudança de Xamarin.Forms para o .NET MAUI:

Xamarin.Forms API .NET MAUI API Comentários
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add A Add sobrecarga que aceita 3 argumentos não está presente no .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.Add A Add sobrecarga que aceita 5 argumentos não está presente no .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal Nenhum .NET MAUI equivalente.
Xamarin.Forms.Grid.IGridList<T>.AddVertical Nenhum .NET MAUI equivalente.
Xamarin.Forms.RelativeLayout Microsoft.Maui.Controls.Compatibility.RelativeLayout No .NET MAUI, RelativeLayout só existe como um controle de compatibilidade para usuários que migram do Xamarin.Forms. Em Grid vez disso, use ou adicione o para o xmlns namespace de compatibilidade.
Xamarin.Forms API .NET MAUI API Comentários
Xamarin.Forms.AbsoluteLayout.IAbsoluteList<T>.Add A Add sobrecarga que aceita 3 argumentos não está presente no .NET MAUI.
Xamarin.Forms.Grid.IGridList<T>.AddHorizontal Nenhum .NET MAUI equivalente.
Xamarin.Forms.Grid.IGridList<T>.AddVertical Nenhum .NET MAUI equivalente.
Xamarin.Forms.RelativeLayout Microsoft.Maui.Controls.Compatibility.RelativeLayout No .NET MAUI, RelativeLayout só existe como um controle de compatibilidade para usuários que migram do Xamarin.Forms. Em Grid vez disso, use ou adicione o para o xmlns namespace de compatibilidade.

Além disso, a adição de filhos a um layout no código é Xamarin.Forms realizada adicionando os filhos à coleção do Children layout:

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

No .NET MAUI, a Children coleção é para uso interno pelo .NET MAUI e não deve ser manipulada diretamente. Portanto, no código os filhos devem ser adicionados diretamente ao layout:

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

Importante

Quaisquer Add métodos de extensão de layout, como GridExtensions.Add, são invocados no layout em vez da coleção de layouts Children .

Você pode notar ao executar seu aplicativo .NET MAUI atualizado que o comportamento do layout é diferente. Para obter mais informações, consulte Alterações de comportamento de layout do Xamarin.Forms.

Alterações de layout personalizadas

O processo para criar um layout personalizado em Xamarin.Forms envolve a criação de uma classe que deriva de Layout<View>e substituindo os OnMeasure métodos e LayoutChildren . Para obter mais informações, consulte Criar um layout personalizado no Xamarin.Forms.

No .NET MAUI, as classes de layout derivam da classe abstrata Layout . Essa classe delega o layout e a medição entre plataformas a uma classe de gerenciador de layout. Cada classe do gerenciador de layout implementa a ILayoutManager interface, que especifica que Measure e ArrangeChildren as implementações devem ser fornecidas:

  • A Measure implementação chama IView.Measure cada modo de exibição no layout e retorna o tamanho total do layout dadas as restrições.
  • A ArrangeChildren implementação determina onde cada modo de exibição deve ser colocado dentro dos limites do layout e chama Arrange cada modo de exibição com seus limites apropriados. O valor de retorno é o tamanho real do layout.

Para obter mais informações, consulte Layouts personalizados.

Alterações no dispositivo

Xamarin.Forms tem uma Xamarin.Forms.Device classe que ajuda você a interagir com o dispositivo e a plataforma em que o aplicativo está sendo executado. A classe equivalente no .NET MAUI, , Microsoft.Maui.Controls.Deviceé preterida e sua funcionalidade é substituída por vários tipos.

A tabela a seguir mostra as substituições do .NET MAUI para a funcionalidade na Xamarin.Forms.Device classe:

Xamarin.Forms API .NET MAUI API Comentários
Xamarin.Forms.Device.Android Microsoft.Maui.Devices.DevicePlatform.Android
Xamarin.Forms.Device.iOS Microsoft.Maui.Devices.DevicePlatform.iOS
Xamarin.Forms.Device.GTK Nenhum .NET MAUI equivalente.
Xamarin.Forms.Device.macOS Nenhum .NET MAUI equivalente. Em vez disso, use 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 Nenhum .NET MAUI equivalente.
Xamarin.Forms.Device.Flags Nenhum .NET MAUI equivalente.
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 Nenhum .NET MAUI equivalente.
Xamarin.Forms.Device.GetNamedSize Nenhum .NET MAUI equivalente.
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 Nenhum .NET MAUI equivalente.
Xamarin.Forms.Device.SetFlowDirection Microsoft.Maui.Controls.Window.FlowDirection
Xamarin.Forms.Device.StartTimer Microsoft.Maui.Dispatching.DispatcherExtensions.StartTimer ou Microsoft.Maui.Dispatching.Dispatcher.DispatchDelayed

Alterações no mapa

No Xamarin.Forms, o controle e os Map tipos associados estão no Xamarin.Forms.Maps namespace. No .NET MAUI, essa funcionalidade foi movida para os Microsoft.Maui.Controls.Maps namespaces e Microsoft.Maui.Maps . Algumas propriedades foram renomeadas e alguns tipos foram substituídos por tipos equivalentes do Xamarin.Essentials.

A tabela a seguir mostra as substituições do .NET MAUI para a funcionalidade no Xamarin.Forms.Maps namespace:

.NET MAUI tem dois Map tipos - Microsoft.Maui.Controls.Maps.Map e Microsoft.Maui.ApplicationModel.Map. Como o namespace é uma das diretivas do .NET MAUI, ao usar o Microsoft.Maui.ApplicationModelMicrosoft.Maui.Controls.Maps.Map controle do código, você terá que qualificar totalmente seu Map uso ou usar um alias global usingde uso.

Em XAML, uma definição de xmlns namespace deve ser adicionada para o Map controle. Embora isso não seja necessário, ele evita uma colisão entre os Polygon tipos e , que existem nos Microsoft.Maui.Controls.Maps namespaces e PolylineMicrosoft.Maui.Controls.Shapes . Para obter mais informações, consulte Exibir um mapa.

Outras alterações

Um pequeno número de outras APIs foram consolidadas na mudança do Xamarin.Forms .NET MAUI. A tabela a seguir mostra essas alterações:

Alterações de formulários nativos

Formulários nativos em Xamarin.Forms tornou-se incorporação nativa no .NET MAUI e usa uma abordagem de inicialização diferente e diferentes métodos de extensão para converter controles de plataforma cruzada para seus tipos nativos. Para obter mais informações, consulte Incorporação nativa.

Inicializar seu aplicativo migrado

Ao atualizar manualmente um Xamarin.Forms para o .NET MAUI, você precisará habilitar o suporte ao .NET MAUI em cada projeto de plataforma, atualizar a classe de ponto de entrada de cada projeto de plataforma e configurar a inicialização do seu aplicativo .NET MAUI.

Habilitar o .NET MAUI em projetos de plataforma

Antes de atualizar a classe de ponto de entrada de cada projeto de plataforma, você deve primeiro habilitar o suporte ao .NET MAUI. Isso pode ser alcançado definindo a $(UseMaui) propriedade build como true em cada projeto de plataforma:

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

Importante

Você deve adicionar <UseMaui>true</UseMaui> ao seu arquivo de projeto para habilitar o suporte ao .NET MAUI. Além disso, verifique se você adicionou <EnableDefaultMauiItems>false</EnableDefaultMauiItems> ao arquivo de projeto WinUI. Isso impedirá que você receba erros de compilação sobre o InitializeComponent método que já está sendo definido.

Adicionar referências do pacote

No .NET 8, o .NET MAUI é fornecido como uma carga de trabalho do .NET e vários pacotes NuGet. A vantagem dessa abordagem é que ela permite que você fixe facilmente seus projetos em versões específicas, além de permitir que você visualize facilmente compilações inéditas ou experimentais.

Você deve adicionar as seguintes referências explícitas de pacote a um em cada arquivo de <ItemGroup> projeto:

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

A $(MauiVersion) variável é referenciada a partir da versão do .NET MAUI que você instalou. Você pode substituir isso adicionando a propriedade build a $(MauiVersion) cada arquivo de projeto:

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

Configuração do projeto Android

Em seu projeto .NET MAUI Android, atualize a MainApplication classe para corresponder ao código abaixo:

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();
    }
}

Atualize também a MainActivity classe para herdar de 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);
        }
    }
}

Em seguida, atualize o arquivo de manifesto para especificar que o minSdKVersion é 21, que é a versão mínima do SDK do Android exigida pelo .NET MAUI. Isso pode ser obtido modificando o <uses-sdk /> nó, que é um filho do <manifest> nó:

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

Configuração do projeto iOS

Em seu projeto iOS .NET MAUI, atualize a AppDelegate classe para herdar de 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();
    }
}

Em seguida, atualize o Info.plist para que seja 11.0, que MinimumOSVersion é a versão mínima do iOS exigida pelo .NET MAUI.

Configuração do projeto UWP

Em seu projeto .NET MAUI WinUI 3, atualize App.xaml para corresponder ao código abaixo:

<?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>

Observação

Se seu projeto incluiu recursos em seu App.xaml existente, você deve migrá-los para a nova versão do arquivo.

Além disso, atualize App.xaml.cs para corresponder ao código abaixo:

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();
}

Observação

Se seu projeto incluiu lógica de negócios em App.xaml.cs você deverá migrar essa lógica para a nova versão do arquivo.

Em seguida, adicione um arquivo launchSettings.json à pasta Properties do projeto e adicione o seguinte JSON ao arquivo:

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

Ponto de entrada do aplicativo

Os aplicativos .NET MAUI têm um único ponto de entrada de aplicativo de plataforma cruzada. Cada ponto de entrada da plataforma chama um método na classe estática MauiProgram e retorna um MauiAppCreateMauiApp arquivo .

Portanto, adicione uma nova classe chamada MauiProgram que contém o seguinte código:

namespace YOUR_NAMESPACE_HERE;

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

        return builder.Build();
    }
}

Alterações de AssemblyInfo

As propriedades que normalmente são definidas em um arquivo AssemblyInfo.cs agora estão disponíveis em seu projeto no estilo SDK. Recomendamos migrá-los de AssemblyInfo.cs para o arquivo de projeto em cada projeto e remover o arquivo AssemblyInfo.cs.

Opcionalmente, você pode manter o arquivo AssemblyInfo.cs e definir a propriedade no arquivo de GenerateAssemblyInfo projeto como false:

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

Para obter mais informações sobre a GenerateAssemblyInfo propriedade, consulte GenerateAssemblyInfo.

Atualizar dependências de aplicativos

Geralmente, os pacotes NuGet não são compatíveis com o .NET 8, Xamarin.Forms a menos que tenham sido recompilados usando monikers (TFMs) da estrutura de destino do .NET. No entanto, os aplicativos Android podem usar pacotes NuGet direcionados às monoandroid e monoandroidXX.X estruturas.

Você pode confirmar que um pacote é compatível com o .NET 8 observando a guia Estruturas no NuGet para o pacote que você está usando e verificando se ele lista uma das estruturas compatíveis mostradas na tabela a seguir:

Estruturas compatíveis Estruturas incompatíveis
net8.0-android, monoandroid, monoandroidXX.X
net8.0-ios monotoque, xamarinios, xamarinios10
net8.0-macos monomac, xamarinmac, xamarinmac20
net8.0-tvos xamarintvos
xamarinwatchos

Observação

As bibliotecas do .NET Standard que não têm dependências nas estruturas incompatíveis listadas acima ainda são compatíveis com o .NET 8.

Se um pacote no NuGet indicar compatibilidade com qualquer uma das estruturas compatíveis acima, independentemente de também incluir estruturas incompatíveis, o pacote será compatível. Pacotes NuGet compatíveis podem ser adicionados ao seu projeto de biblioteca .NET MAUI usando o gerenciador de pacotes NuGet no Visual Studio.

Se você não conseguir encontrar uma versão compatível com .NET 8 de um pacote NuGet, você deverá:

  • Recompile o pacote com .NET TFMs, se você possuir o código.
  • Procure uma versão de visualização de uma versão .NET 8 do pacote.
  • Substitua a dependência por uma alternativa compatível com .NET 8.

Compilar e solucionar problemas

Depois que suas dependências forem resolvidas, você deverá criar seu projeto. Quaisquer erros irão guiá-lo para os próximos passos.

Dica

  • Exclua todas as pastas bin e obj de todos os projetos antes de abrir e criar projetos no Visual Studio, especialmente ao alterar versões do .NET.
  • Exclua o arquivo gerado .cs Resource.designer do projeto Android.

A tabela a seguir fornece orientação para superar problemas comuns de compilação ou tempo de execução:

Problema Dica
Xamarin.* namespace não existe. Atualize o namespace para seu equivalente .NET MAUI. Para obter mais informações, consulte Alterações de namespace.
API não existe. Atualize o uso da API para seu equivalente do .NET MAUI. Para obter mais informações, consulte Alterações na API.
O aplicativo não será implantado. Verifique se o projeto de plataforma necessário está definido para implantação no Gerenciador de Configurações do Visual Studio.
O aplicativo não será iniciado. Atualize a classe de ponto de entrada de cada projeto de plataforma e o ponto de entrada do aplicativo. Para obter mais informações, consulte Inicializar seu aplicativo migrado.
CollectionView não rola. Verifique o layout do contêiner e o tamanho medido do CollectionView. Por padrão, o controle ocupará tanto espaço quanto o contêiner permitir. A Grid restringe as crianças em seu próprio tamanho. No entanto, a StackLayout permite que as crianças ocupem espaço além de seus limites.
O pop-up é exibido na página no iOS. No Xamarin.Forms, todos os pop-ups no iOS são instâncias, mas no .NET MAUI os pop-ups são UIWindow exibidos localizando a apresentação ViewController atual e exibindo o pop-up com PresentViewControllerAsync. Em plugins como Mopups, para garantir que seus pop-ups sejam exibidos corretamente, você deve chamar DisplayAlert, DisplayActionSheetou DisplayPromptAsync a ContentPage partir do que é usado dentro do Mopup pop-up.
BoxView não aparecendo. O tamanho padrão de uma BoxView entrada Xamarin.Forms é 40x40. O tamanho padrão de um BoxView no .NET MAUI é 0x0. Definido WidthRequest e HeightRequest para 40.
O layout está faltando preenchimento, margem ou espaçamento. Adicione valores padrão ao seu projeto com base no recurso de estilo MAUI do .NET. Para obter mais informações, consulte Alterações de valor padrão de Xamarin.Forms.
O layout personalizado não funciona. O código de layout personalizado precisa ser atualizado para funcionar no .NET MAUI. Para obter mais informações, consulte Alterações de layout personalizadas.
O renderizador personalizado não funciona. O código do renderizador precisa de atualização para funcionar no .NET MAUI. Para obter mais informações, consulte Usar renderizadores personalizados no .NET MAUI.
O efeito não funciona. O código de efeito precisa ser atualizado para funcionar no .NET MAUI. Para obter mais informações, consulte Usar efeitos no .NET MAUI.
SkiaSharp código não funciona. SkiaSharp código precisa de pequenas atualizações para funcionar no .NET MAUI. Para obter mais informações, consulte Reutilizar SkiaSharp código no .NET MAUI.
Não é possível acessar dados de propriedades de aplicativo criados anteriormente. Migre os dados de propriedades do aplicativo para as preferências do .NET MAUI. Para obter mais informações, consulte Migrar dados do dicionário de propriedades do aplicativo para as Xamarin.Forms preferências do .NET MAUI.
Não é possível acessar dados de armazenamento seguro criados anteriormente. Migre os dados de armazenamento seguro para o .NET MAUI. Para obter mais informações, consulte Migrar do armazenamento seguro para o armazenamento seguro do Xamarin.Essentials .NET MAUI.
Não é possível acessar dados de controle de versão criados anteriormente. Migre os dados de controle de versão para o .NET MAUI. Para obter mais informações, consulte Migrar dados de controle de versão de um aplicativo para um Xamarin.Forms aplicativo .NET MAUI.

Confira também