Condividi tramite


Estendere .NET Ricaricamento rapido usando MetadataUpdateHandler (C#, Visual Basic)

È possibile estendere a livello di codice il supporto di .NET Ricaricamento rapido per altri scenari che in genere non sono supportati, ad esempio le modifiche al codice che richiedono la cancellazione di una cache o l'aggiornamento dell'interfaccia utente. Ad esempio, per supportare il ricaricamento rapido con un serializzatore JSON, è necessario cancellarne la cache quando viene modificato un tipo. Per gli sviluppatori .NET MAUI, potrebbe essere necessario estendere il ricaricamento rapido per le modifiche o gli aggiornamenti che non attivano il ricaricamento rapido in condizioni normali, ad esempio la modifica di un costruttore o un gestore eventi per un elemento dell'interfaccia utente. È possibile usare MetadataUpdateHandlerAttribute per aggiornare lo stato dell'applicazione, attivare un nuovo rendering dell'interfaccia utente o eseguire azioni simili.

Il tipo specificato da questo attributo deve implementare metodi statici corrispondenti alla firma di uno o più dei seguenti elementi:

static void ClearCache(Type[]? updatedTypes)
static void UpdateApplication(Type[]? updatedTypes)

ClearCache offre ai gestori di aggiornamento l'opportunità di cancellare tutte le cache dedotte in base ai metadati dell'applicazione. Dopo che tutti i ClearCache metodi sono stati richiamati, UpdateApplication viene richiamato per ogni gestore che ne specifica uno. È possibile usare UpdateApplication per aggiornare l'interfaccia utente.

Esempio

L'esempio seguente illustra uno scenario per un progetto MAUI .NET che inizialmente non supporta il ricaricamento rapido, ma quindi supporta la funzionalità dopo l'implementazione MetadataUpdateHandlerdi .

Testare Ricaricamento rapido .NET

  1. Creare un nuovo progetto MAUI .NET in Visual Studio. Scegliere il modello di progetto .NET MAUI App .

  2. In App.xaml.cs sostituire il codice per creare MainPage con il codice seguente:

    //MainPage = new MainPage(); // Template default code
    MainPage = new NavigationPage(new MainPage());
    

    Successivamente, si implementa un metodo Build per semplificare un aggiornamento dell'interfaccia utente in C#. Questo metodo imposta e ContentPage.Content viene chiamato nell'oggetto della OnNavigatedTopagina. L'evento OnNavigatedTo deve essere ospitato all'interno di Shell o navigationPage.

  3. In MainPage.xaml.cs sostituire il codice del MainPage costruttore con il codice seguente:

    public MainPage()
    {
       InitializeComponent();
       Build();
    }
    
    void Build() => Content =
       new Label
       {
          Text = "First line\nSecond line"
       };
    
    protected override void OnNavigatedTo(NavigatedToEventArgs args)
    {
       base.OnNavigatedTo(args);
       Build();
    }
    
  4. Premere F5 per avviare l'app.

  5. Dopo il caricamento della pagina, modificare il testo dell'etichetta nel codice C# in un formato simile al seguente: "Prima riga\nSecond line\nThird line"

  6. Selezionare il pulsante Ricaricamento rapidoScreenshot del pulsante Ricaricamento rapido..

    Il testo aggiornato non viene visualizzato nell'app in esecuzione. Per impostazione predefinita non è disponibile alcun supporto Ricaricamento rapido per questo scenario.

    Screenshot del Ricaricamento rapido non funzionante.

Aggiungere MetadataUpdateHandler

In un'app MAUI .NET è necessario eseguire di nuovo il codice dell'interfaccia utente C# dopo aver apportato una modifica al codice. Se il codice dell'interfaccia utente è scritto in C#, è possibile usare il UpdateApplication metodo in MetadataUpdateHandler per ricaricare l'interfaccia utente. Per configurare questa impostazione, aggiungere HotReloadService.cs all'applicazione usando il codice seguente.

#if DEBUG
[assembly: System.Reflection.Metadata.MetadataUpdateHandlerAttribute(typeof(YourAppNamespace.HotReloadService))]
namespace YourAppNamespace { 
    public static class HotReloadService
    {
        #pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
        public static event Action<Type[]?>? UpdateApplicationEvent;
        #pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

        internal static void ClearCache(Type[]? types) { }
        internal static void UpdateApplication(Type[]? types) {
            UpdateApplicationEvent?.Invoke(types);
        }
    }
}
#endif

Assicurarsi di sostituire YourAppNamespace con lo spazio dei nomi per la pagina di destinazione.

Dopo aver aggiunto il codice precedente, quando si modifica il codice attivo in Visual Studio, si verifica una modifica dei metadati e l'app invia .UpdateApplicationEvent È quindi necessario aggiungere codice per registrare l'evento ed eseguire l'aggiornamento dell'interfaccia utente.

Nota

Per questo scenario, è necessario abilitare Ricaricamento rapido XAML.

In MainPage.xaml.cs aggiungere codice per registrare il UpdateApplicationEvent gestore eventi nell'evento OnNavigatedTo .

protected override void OnNavigatedTo(NavigatedToEventArgs args)
    {
        base.OnNavigatedTo(args);

        Build();

#if DEBUG
        HotReloadService.UpdateApplicationEvent += ReloadUI;
#endif
    }

Annullare la sottoscrizione del gestore eventi in OnNavigatedFrom e quindi aggiungere codice per gestire l'evento ed eseguire nuovamente la chiamata a Build.

protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
   {
   base.OnNavigatedFrom(args);

#if DEBUG
   HotReloadService.UpdateApplicationEvent -= ReloadUI;
#endif
    }

private void ReloadUI(Type[] obj)
{
   MainThread.BeginInvokeOnMainThread(() =>
   {
      Build();
   });
}

Avviare l'app. Quando si apporta una modifica al testo dell'etichetta nel codice C# e si preme il pulsante Ricaricamento rapido, l'interfaccia utente viene aggiornata.

Screenshot del funzionamento di Ricaricamento rapido.