Bagikan melalui


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 sesuai dengan tanda tangan dari satu atau lebih dari berikut ini:

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.

Example

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 seperti: "Baris pertama\nBaris kedua\nBaris ketiga"

  6. Pilih tombol Hot ReloadCuplikan layar tombol Hot Reload.

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

    Cuplikan layar Hot Reload tidak berfungsi.

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 metode UpdateApplication dalam MetadataUpdateHandler untuk 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 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.

Nota

Untuk skenario ini, XAML Hot Reload harus diaktifkan.

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

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

        Build();

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

Hentikan penanganan kejadian pada OnNavigatedFrom, lalu tambahkan kode untuk menangani kejadian tersebut dan mengeksekusi ulang 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 Hot Reload, UI akan diperbarui!

Cuplikan layar Hot Reload berfungsi.