Perluas .NET Hot Reload menggunakan MetadataUpdateHandler (C#, Visual Basic)

Anda dapat secara terprogram memperluas dukungan .NET Hot Reload untuk skenario tambahan yang biasanya tidak didukung, seperti perubahan kode yang memerlukan penghapusan cache atau refresh UI. Misalnya, untuk mendukung hot reload dengan serializer JSON, Anda perlu menghapus cache saat jenis dimodifikasi. Untuk pengembang MAUI .NET, Anda mungkin perlu memperluas pemuatan ulang panas untuk pengeditan/pembaruan yang tidak memicu pemuatan ulang panas dalam kondisi normal, seperti mengedit konstruktor, atau penanganan aktivitas untuk elemen UI. Anda dapat menggunakan MetadataUpdateHandlerAttribute untuk merefresh status aplikasi, memicu render ulang UI, atau melakukan tindakan serupa.

Jenis yang ditentukan oleh atribut ini harus menerapkan metode statis yang cocok dengan tanda tangan satu atau beberapa hal berikut:

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

ClearCache memberi penanganan pembaruan kesempatan untuk menghapus cache apa pun yang disimpulkan berdasarkan metadata aplikasi. Setelah semua ClearCache metode dipanggil, UpdateApplication dipanggil untuk setiap handler yang menentukannya. Anda mungkin menggunakan UpdateApplication untuk menyegarkan UI.

Contoh

Contoh berikut menunjukkan skenario untuk proyek .NET MAUI yang awalnya tidak mendukung hot reload, tetapi kemudian mendukung fitur setelah menerapkan MetadataUpdateHandler.

Uji .NET Hot Reload

  1. Buat proyek .NET MAUI baru di Visual Studio. Pilih templat proyek Aplikasi .NET MAUI.

  2. Di App.xaml.cs, ganti kode untuk membuat MainPage dengan kode berikut:

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

    Selanjutnya, Anda menerapkan metode Build untuk menyederhanakan pembaruan UI di C#. Metode ini mengatur ContentPage.Content dan dipanggil di halaman OnNavigatedTo. Peristiwa OnNavigatedTo harus dihosting dalam Shell atau NavigationPage.

  3. Di MainPage.xaml.cs, ganti MainPage kode konstruktor dengan kode berikut:

    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. Tekan F5 untuk memulai aplikasi.

  5. Setelah halaman dimuat, ubah teks label dalam kode C# menjadi sesuatu seperti: "Baris pertama\nBaris sejajar\nBaris awal"

  6. Pilih tombol Muat UlangScreenshot of the Hot Reload button. Panas.

    Teks yang diperbarui tidak ditampilkan di aplikasi yang sedang berjalan. Tidak ada dukungan Hot Reload untuk skenario ini secara default.

    Screenshot of Hot Reload not working.

Menambahkan MetadataUpdateHandler

Dalam aplikasi .NET MAUI, Anda harus melakukan sesuatu untuk menjalankan kembali kode antarmuka pengguna C# setelah Anda membuat perubahan kode. Jika kode UI Anda ditulis dalam C#, Anda dapat menggunakan UpdateApplication metode untuk MetadataUpdateHandler memuat ulang UI. Untuk menyiapkannya, tambahkan HotReloadService.cs ke aplikasi Anda menggunakan kode berikut.

#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

Pastikan Anda mengganti YourAppNamespace dengan namespace layanan untuk halaman yang Anda targetkan.

Sekarang, dengan kode sebelumnya ditambahkan, saat Anda mengedit kode langsung di Visual Studio, perubahan metadata terjadi dan aplikasi mengirimkan UpdateApplicationEvent. Jadi, Anda perlu menambahkan kode untuk mendaftarkan peristiwa dan melakukan pembaruan UI.

Catatan

Untuk skenario ini, XAML Hot Reload harus diaktifkan.

Di MainPage.xaml.cs, tambahkan kode untuk mendaftarkan UpdateApplicationEvent penanganan aktivitas dalam OnNavigatedTo peristiwa.

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

        Build();

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

Berhenti berlangganan penanganan aktivitas masuk OnNavigatedFrom lalu tambahkan kode untuk menangani peristiwa dan jalankan kembali panggilan ke Build.

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

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

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

Sekarang, mulai aplikasi. Saat Anda membuat perubahan pada teks label dalam kode C# Anda dan menekan tombol Muat Ulang Panas, UI akan di-refresh!

Screenshot of Hot Reload working.