MetadataUpdateHandler kullanarak .NET Çalışırken Yeniden Yükleme genişletme (C#, Visual Basic)

Önbelleği temizlemeyi veya kullanıcı arabirimini yenilemeyi gerektiren kod değişiklikleri gibi normalde desteklenmeyen ek senaryolar için .NET Çalışırken Yeniden Yükleme desteğini program aracılığıyla genişletebilirsiniz. Örneğin, bir JSON seri hale getiricisi ile sık erişimli yeniden yüklemeyi desteklemek için, bir tür değiştirildiğinde önbelleğini temizlemeniz gerekir. .NET MAUI geliştiricileri için, bir oluşturucuyu düzenleme veya kullanıcı arabirimi öğesi için olay işleyicisi gibi normal koşullarda sık erişimli yeniden yüklemeyi tetiklemeyen düzenlemeler/güncelleştirmeler için sık erişimli yeniden yüklemeyi genişletmeniz gerekebilir. uygulamasını kullanarak MetadataUpdateHandlerAttribute uygulama durumunu yenileyebilir, kullanıcı arabiriminin yeniden işlenmesini tetikleyebilir veya benzer eylemler gerçekleştirebilirsiniz.

Bu öznitelik tarafından belirtilen tür, aşağıdakilerden birinin veya daha fazlasının imzası ile eşleşen statik yöntemler uygulamalıdır:

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

ClearCache güncelleştirme işleyicilerine, uygulamanın meta verilerine göre çıkarsanan tüm önbellekleri temizleme fırsatı verir. Tüm ClearCache yöntemler çağrıldıktan sonra, UpdateApplication birini belirten her işleyici için çağrılır. Kullanıcı arabirimini yenilemek için kullanabilirsiniz UpdateApplication .

Örnek

Aşağıdaki örnekte başlangıçta sık erişimli yeniden yüklemeyi desteklemeyen ancak uygulandıktan MetadataUpdateHandlersonra özelliği destekleyen bir .NET MAUI projesi senaryosu gösterilmektedir.

.NET Çalışırken Yeniden Yükleme test edin

  1. Visual Studio'da yeni bir .NET MAUI projesi oluşturun. .NET MAUI Uygulaması proje şablonunu seçin.

  2. App.xaml.cs dosyasında, MainPage'i oluşturmak için kodu aşağıdaki kodla değiştirin:

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

    Ardından, C# dilinde kullanıcı arabirimi güncelleştirmesini basitleştirmek için bir Derleme yöntemi uygulayacaksınız. Bu yöntem ve öğesini ayarlar ContentPage.Content ve sayfanın OnNavigatedToiçinde çağrılır. Olayın OnNavigatedTo Shell veya NavigationPage içinde barındırılması gerekir.

  3. MainPage.xaml.cs dosyasında oluşturucu kodunu aşağıdaki kodla değiştirinMainPage:

    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. Uygulamayı başlatmak için F5 tuşuna basın.

  5. Sayfa yüklendikten sonra, C# kodundaki etiket metnini şu şekilde değiştirin: "İlk satır\nSaniye satırı\nThird satırı"

  6. Çalışırken Yeniden YüklemeScreenshot of the Hot Reload button. düğmesini seçin.

    Güncelleştirilmiş metin çalışan uygulamada görüntülenmez. Bu senaryo için varsayılan olarak Çalışırken Yeniden Yükleme desteği yoktur.

    Screenshot of Hot Reload not working.

MetadataUpdateHandler'i ekleme

.NET MAUI uygulamasında, kod değişikliği yaptıktan sonra C# kullanıcı arabirimi kodunu yeniden çalıştırmak için bir şey yapmanız gerekir. Kullanıcı arabirimi kodunuz C# dilinde yazılmışsa, kullanıcı arabirimini UpdateApplication yeniden yüklemek için içindeki MetadataUpdateHandler yöntemini kullanabilirsiniz. Bunu ayarlamak için aşağıdaki kodu kullanarak HotReloadService.cs dosyasını uygulamanıza ekleyin.

#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

öğesini hedeflediğiniz sayfanın ad alanıyla değiştirdiğinizden YourAppNamespace emin olun.

Önceki kod eklendiğinde, Visual Studio'da canlı kodu düzenlediğinizde bir meta veri değişikliği gerçekleşir ve uygulama tarafından UpdateApplicationEventgönderilir. Bu nedenle, olayı kaydetmek ve kullanıcı arabirimi güncelleştirmesini gerçekleştirmek için kod eklemeniz gerekir.

Not

Bu senaryo için XAML Çalışırken Yeniden Yükleme etkinleştirilmelidir.

MainPage.xaml.cs dosyasında, olaya olay işleyicisini UpdateApplicationEventOnNavigatedTo kaydetmek için kod ekleyin.

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

        Build();

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

içindeki olay işleyicisinin OnNavigatedFrom aboneliğini kaldırın ve ardından olayı işlemek için kod ekleyin ve çağrısının yeniden yürütülmesini sağlayı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();
   });
}

Şimdi uygulamayı başlatın. C# kodunuzda etiket metninde değişiklik yaptığınızda ve Çalışırken Yeniden Yükleme düğmesine bastığınızda kullanıcı arabirimi yenilenir!

Screenshot of Hot Reload working.