Rozšíření Opětovné načítání za provozu .NET pomocí MetadataUpdateHandler (C#, Visual Basic)

Podporu rozhraní .NET Opětovné načítání za provozu můžete programově rozšířit pro další scénáře, které se obvykle nepodporují, například změny kódu, které vyžadují vymazání mezipaměti nebo aktualizaci uživatelského rozhraní. Pokud například chcete podporovat opětovné načítání za provozu pomocí serializátoru JSON, musíte při změně typu vymazat jeho mezipaměť. Pro vývojáře .NET MAUI možná budete muset rozšířit opětovné načítání za provozu pro úpravy nebo aktualizace, které neaktivují opětovné načítání za normálních podmínek, jako je úprava konstruktoru nebo obslužná rutina události pro prvek uživatelského rozhraní. Můžete použít MetadataUpdateHandlerAttribute k aktualizaci stavu aplikace, aktivaci opětovného vykreslení uživatelského rozhraní nebo provádění podobných akcí.

Typ určený tímto atributem by měl implementovat statické metody odpovídající podpisu jednoho nebo více z následujících:

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

ClearCache poskytuje obslužným rutinám aktualizace příležitost vymazat všechny mezipaměti, které jsou odvozeny na základě metadat aplikace. Po vyvolání UpdateApplication všech ClearCache metod je vyvolána pro každou obslužnou rutinu, která určuje jednu. K aktualizaci uživatelského rozhraní můžete použít UpdateApplication .

Příklad

Následující příklad ukazuje scénář pro projekt .NET MAUI, který zpočátku nepodporuje opětovné načítání za provozu, ale potom tuto funkci podporuje po implementaci MetadataUpdateHandler.

Testování Opětovné načítání za provozu .NET

  1. Vytvořte nový projekt .NET MAUI v sadě Visual Studio. Zvolte šablonu projektu aplikace .NET MAUI.

  2. V souboru App.xaml.cs nahraďte kód, který vytvoří MainPage následujícím kódem:

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

    Dále implementujete metodu sestavení, která zjednoduší aktualizaci uživatelského rozhraní v jazyce C#. Tato metoda nastaví ContentPage.Content a je volána na stránce OnNavigatedTo. Událost OnNavigatedTo musí být hostovaná v prostředí nebo v navigationpage.

  3. V souboru MainPage.xaml.cs nahraďte kód konstruktoru MainPage následujícím kódem:

    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. Stisknutím klávesy F5 spusťte aplikaci.

  5. Po načtení stránky změňte text popisku v kódu C# tak, aby vypadal takto: "First line\nSecond line\nThird line"

  6. Vyberte tlačítko Opětovné načítání za provozuScreenshot of the Hot Reload button..

    Aktualizovaný text se nezobrazuje ve spuštěné aplikaci. Tento scénář ve výchozím nastavení nepodporuje Opětovné načítání za provozu.

    Screenshot of Hot Reload not working.

Přidání obslužné rutiny MetadataUpdateHandler

V aplikaci .NET MAUI musíte udělat něco pro opětovné spuštění kódu uživatelského rozhraní jazyka C# po provedení změny kódu. Pokud je kód uživatelského rozhraní napsaný v jazyce C#, můžete k opětovnému načtení uživatelského rozhraní použít UpdateApplication metodu MetadataUpdateHandler . Pokud chcete tuto funkci nastavit, přidejte do aplikace hotReloadService.cs pomocí následujícího kódu.

#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

Nezapomeňte nahradit YourAppNamespace oborem názvů pro stránku, na kterou cílíte.

Teď se při úpravě živého kódu v sadě Visual Studio při přidání předchozího kódu dojde ke změně metadat a aplikace odešle UpdateApplicationEvent. Proto musíte přidat kód pro registraci události a provedení aktualizace uživatelského rozhraní.

Poznámka:

V tomto scénáři musí být povolená Opětovné načítání za provozu XAML.

V souboru MainPage.xaml.cs přidejte kód pro registraci UpdateApplicationEvent obslužné rutiny OnNavigatedTo události v události.

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

        Build();

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

Odhlaste obslužnou rutinu události a OnNavigatedFrom pak přidejte kód pro zpracování události a znovu spusťte volání Build.

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

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

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

Teď spusťte aplikaci. Když v kódu jazyka C# změníte text popisku a stisknete tlačítko Opětovné načítání za provozu, uživatelské rozhraní se aktualizuje.

Screenshot of Hot Reload working.