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, 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 MetadataUpdateHandler
programu .
Testowanie Przeładowywanie na gorąco platformy .NET
Utwórz nowy projekt MAUI platformy .NET w programie Visual Studio. Wybierz szablon projektu .NET MAUI App.
W 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ływanaOnNavigatedTo
w pliku strony . ZdarzenieOnNavigatedTo
musi być hostowane w powłoce lub w programie NavigationPage.W 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(); }
Naciśnij F5 , aby uruchomić aplikację.
Po załadowaniu strony zmień tekst etykiety w kodzie języka C# na podobny do: "Pierwszy wiersz\nSecond line\nThird line"
Wybierz przycisk Przeładowywanie na gorąco.
Zaktualizowany tekst nie jest wyświetlany w uruchomionej aplikacji. Domyślnie nie ma obsługi Przeładowywanie na gorąco dla tego scenariusza.
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 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 MainPage.xaml.cs dodaj kod, aby zarejestrować UpdateApplicationEvent
program obsługi zdarzeń w zdarzeniu OnNavigatedTo
.
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!