Partager via


Étendre des Rechargement à chaud .NET à l’aide de MetadataUpdateHandler (C#, Visual Basic)

Vous pouvez étendre par programmation la prise en charge de Rechargement à chaud.NET pour des scénarios supplémentaires qui ne sont généralement pas pris en charge, tels que les modifications de code qui nécessitent l’effacement d’un cache ou l’actualisation de l’interface utilisateur. Par exemple, pour prendre en charge le rechargement à chaud avec un sérialiseur JSON, vous devez effacer son cache lorsqu’un type est modifié. Pour les développeurs .NET MAUI, vous devrez peut-être étendre le rechargement à chaud pour les modifications/mises à jour qui ne déclenchent pas de rechargement à chaud dans des conditions normales, telles que la modification d’un constructeur ou un gestionnaire d’événements pour un élément d’interface utilisateur. Vous pouvez utiliser pour MetadataUpdateHandlerAttribute actualiser l’état de l’application, déclencher un nouveau rendu de l’interface utilisateur ou effectuer des actions similaires.

Le type spécifié par cet attribut doit implémenter des méthodes statiques correspondant à la signature d’un ou plusieurs des éléments suivants :

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

ClearCache permet aux gestionnaires de mises à jour d’effacer tous les caches déduits en fonction des métadonnées de l’application. Une fois toutes les ClearCache méthodes appelées, UpdateApplication est appelé pour chaque gestionnaire qui en spécifie une. Vous pouvez utiliser UpdateApplication pour actualiser l’interface utilisateur.

Exemple

L’exemple suivant montre un scénario pour un projet .NET MAUI qui ne prend initialement pas en charge le rechargement à chaud, mais prend ensuite en charge la fonctionnalité après l’implémentation MetadataUpdateHandlerde .

Tester le rechargement à chaud .NET

  1. Créer un nouveau projet .NET MAUI dans Visual Studio. Choisissez le modèle de projet .NET MAUI App .

  2. Dans App.xaml.cs, remplacez le code pour créer MainPage par le code suivant :

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

    Ensuite, vous implémentez une méthode Build pour simplifier une mise à jour de l’interface utilisateur en C#. Cette méthode définit ContentPage.Content et est appelée dans la page .OnNavigatedTo L’événement OnNavigatedTo doit être hébergé dans Shell ou navigationPage.

  3. Dans MainPage.xaml.cs, remplacez le code du MainPage constructeur par le code suivant :

    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. Appuyez sur F5 pour démarrer l'application.

  5. Une fois la page chargée, remplacez le texte de l’étiquette dans le code C# par quelque chose comme : « Première ligne\nDeuxième ligne\nTroisième ligne »

  6. Sélectionnez le bouton Rechargement à chaud Capture d’écran du bouton Rechargement à chaud..

    Le texte mis à jour ne s’affiche pas dans l’application en cours d’exécution. Il n’existe aucune prise en charge du Rechargement à chaud pour ce scénario par défaut.

    Capture d’écran du rechargement à chaud qui ne fonctionne pas.

Ajouter le MetadataUpdateHandler

Dans une application .NET MAUI, vous devez effectuer une action pour réexécuter le code de l’interface utilisateur C# après avoir apporté une modification au code. Si votre code d’interface utilisateur est écrit en C#, vous pouvez utiliser la UpdateApplication méthode dans MetadataUpdateHandler pour recharger l’interface utilisateur. Pour configurer cela, ajoutez HotReloadService.cs à votre application à l’aide du code suivant.

#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

Veillez à remplacer YourAppNamespace par l’espace de noms de la page que vous ciblez.

Maintenant, avec le code précédent ajouté, lorsque vous modifiez du code en direct dans Visual Studio, une modification des métadonnées se produit et l’application distribue le UpdateApplicationEvent. Vous devez donc ajouter du code pour inscrire l’événement et effectuer la mise à jour de l’interface utilisateur.

Notes

Pour ce scénario, le Rechargement à chaud XAML doit être activé.

Dans MainPage.xaml.cs, ajoutez du code pour inscrire le gestionnaire d’événements UpdateApplicationEvent dans l’événement OnNavigatedTo.

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

        Build();

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

Désabonnez le gestionnaire d’événements dans OnNavigatedFrom, puis ajoutez du code pour gérer l’événement et réexécutez l’appel à Build.

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

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

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

Maintenant, démarrez l’application. Lorsque vous apportez une modification au texte de l’étiquette dans votre code C# et que vous appuyez sur le bouton Rechargement à chaud, l’interface utilisateur est actualisée !

Capture d’écran du rechargement à chaud qui fonctionne.