Rozszerzanie Przeładowywanie na gorąco .NET przy użyciu programu MetadataUpdateHandler (C#, Visual Basic)

Można programowo rozszerzyć obsługę platformy .NET Przeładowywanie na gorąco w przypadku dodatkowych scenariuszy, które nie są zwykle obsługiwane, takich jak zmiany kodu, które wymagają wyczyszczenia pamięci podręcznej lub odświeżenia interfejsu użytkownika. Na przykład w celu obsługi przeładowywania na gorąco za pomocą serializatora JSON należy wyczyścić jego pamięć podręczną po zmodyfikowaniu typu. W przypadku deweloperów programu .NET MAUI może być konieczne rozszerzenie ponownego ładowania na gorąco dla edycji/aktualizacji, które nie wyzwalają ponownego ładowania na gorąco w normalnych warunkach, takich jak edytowanie konstruktora lub procedura obsługi zdarzeń dla elementu interfejsu użytkownika. Możesz użyć polecenia MetadataUpdateHandlerAttribute , aby odświeżyć stan aplikacji, wyzwolić ponowne renderowanie interfejsu użytkownika lub wykonać podobne akcje.

Typ określony przez ten atrybut powinien implementować metody statyczne pasujące do podpisu co najmniej jednego z następujących elementów:

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

ClearCache Program obsługi aktualizacji umożliwia wyczyszczenie wszelkich buforów, które są wnioskowane na podstawie metadanych aplikacji. Po wywołaniu UpdateApplication wszystkich ClearCache metod jest wywoływana dla każdego programu obsługi, który określa jeden. Możesz użyć UpdateApplication polecenia , aby odświeżyć interfejs użytkownika.

Przykład

W poniższym przykładzie przedstawiono scenariusz dla projektu MAUI platformy .NET, który początkowo nie obsługuje ponownego ładowania na gorąco, ale następnie obsługuje tę funkcję po zaimplementowaniu MetadataUpdateHandlerprogramu .

Testowanie Przeładowywanie na gorąco platformy .NET

  1. Utwórz nowy projekt MAUI platformy .NET w programie Visual Studio. Wybierz szablon projektu .NET MAUI App.

  2. W pliku App.xaml.cs zastąp kod, aby utworzyć stronę MainPage następującym kodem:

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

    Następnie zaimplementujesz metodę kompilacji, aby uprościć aktualizację interfejsu użytkownika w języku C#. Ta metoda ustawia metodę ContentPage.Content i jest wywoływana OnNavigatedTow pliku strony . Zdarzenie OnNavigatedTo musi być hostowane w powłoce lub w programie NavigationPage.

  3. W pliku MainPage.xaml.cs zastąp kod konstruktora MainPage następującym kodem:

    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. Naciśnij klawisz F5 , aby uruchomić aplikację.

  5. Po załadowaniu strony zmień tekst etykiety w kodzie języka C# na podobny do: "Pierwszy wiersz\nSecond line\nThird line"

  6. Wybierz przycisk Przeładowywanie na gorącoScreenshot of the Hot Reload button..

    Zaktualizowany tekst nie jest wyświetlany w uruchomionej aplikacji. Domyślnie nie ma obsługi Przeładowywanie na gorąco dla tego scenariusza.

    Screenshot of Hot Reload not working.

Dodawanie programu MetadataUpdateHandler

W aplikacji .NET MAUI należy wykonać coś, aby ponownie uruchomić kod interfejsu użytkownika języka C# po wprowadzeniu zmiany kodu. Jeśli kod interfejsu użytkownika jest napisany w języku C#, możesz użyć UpdateApplication metody w pliku , MetadataUpdateHandler aby ponownie załadować interfejs użytkownika. Aby to skonfigurować, dodaj plik HotReloadService.cs do aplikacji przy użyciu następującego kodu.

#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

Upewnij się, że zastąpisz YourAppNamespace przestrzeń nazw dla docelowej strony.

Teraz po dodaniu poprzedniego kodu podczas edytowania kodu na żywo w programie Visual Studio następuje zmiana metadanych, a aplikacja wysyła element UpdateApplicationEvent. Dlatego należy dodać kod, aby zarejestrować zdarzenie i wykonać aktualizację interfejsu użytkownika.

Uwaga

W tym scenariuszu należy włączyć Przeładowywanie na gorąco XAML.

W pliku MainPage.xaml.cs dodaj kod, aby zarejestrować UpdateApplicationEvent program obsługi zdarzeń w OnNavigatedTo zdarzeniu.

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

        Build();

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

Anuluj subskrypcję programu obsługi zdarzeń w programie OnNavigatedFrom , a następnie dodaj kod, aby obsłużyć zdarzenie i ponownie wykonać wywołanie metody .Build

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

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

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

Teraz uruchom aplikację. Po zmianie tekstu etykiety w kodzie języka C# i naciśnięciu przycisku Przeładowywanie na gorąco interfejs użytkownika zostanie odświeżony!

Screenshot of Hot Reload working.