C# UI 및 .NET 핫 리로드 - .NET MAUI에서 만들어진 매치

7591 단어
Visual Studio 2022 및 .NET 6에는 애플리케이션을 디버깅하는 동안 C# 코딩을 계속하고 중단 없이 변경 내용을 사용할 수 있는 기능인 .NET 핫 리로드가 도입되었습니다. 편집하며 계속하기를 사용해 본 적이 있다면 비슷한 느낌일 것입니다.
  • 앱 디버깅 시작
  • 일부 C#을 추가하거나 편집합니다
  • .
  • Visual Studio에서 "Hot Reload"버튼을 클릭합니다
  • .
  • 코드 경로를 다시 트리거하여 새 코드 실행

  • 대부분의 경우 .NET MAUI에서는 XAML을 사용하여 UI를 선언하고 XAML Hot Reload를 사용하여 반복적인 중지 및 시작을 방지합니다. 이것은 정말 잘 작동할 수 있습니다. XAML 편집을 수행할 때마다 XAML 컴파일러가 편집이 유효한 코드임을 나타내면 변경 내용이 실행 중인 앱으로 전달되고 상태를 유지하면서 UI가 업데이트됩니다.

    XAML에서 세션을 중지했다가 다시 시작해야 하므로 흐름이 끊기는 경우가 많습니다. C#을 완전히 유지하면 이 상황이 크게 개선됩니다.

    C# UI와 .NET 핫 리로드 결합



    C#에서 UI 코드를 편집할 때 해당 코드를 다시 실행하고 변경의 영향을 확인하기 위해 무언가를 수행해야 합니다. 피곤해질 수 있습니다. 제가 하는 일은 다음과 같습니다.
    Build 메서드에 UI 구성을 배치하는 패턴이 마음에 듭니다. 이 메서드는 ContentPage.Content를 설정하고 OnNavigatedTo 또는 Shell 내에서 호스팅될 때 페이지의 NavigationPage 메서드에서 호출됩니다.

    void Build() => Content = 
            new Grid { 
    
            };
    
    protected override void OnNavigatedTo(NavigatedToEventArgs args)
    {
        base.OnNavigatedTo(args);
    
        Build();
    }
    


    엄청난! 하지만 이 메서드는 한 번만 호출됩니다. 해당 페이지에서 벗어나 다시 돌아올 수 있습니다. 또는 방법을 수동으로 트리거하는 제스처를 추가할 수 있습니다. 그것은 빨리 늙습니다.

    XAML 핫 리로드와 유사하게 핫 리로드를 트리거할 때마다 Build() 메서드를 확인할 수 있다면 어떨까요?

    할 수 있다는 것이 밝혀졌습니다! .NET Hot Reload가 실행될 때마다 메타데이터 변경이 트리거되고 이에 연결할 수 있습니다. 이를 위해 프로젝트에 HotReloadService.cs를 추가합니다.

    #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
    


    변경 사항이 발생할 때마다 앱은 이제 이벤트를 전달합니다. 현재 작업 중인 파일에서 빌드를 다시 실행하려는 경우 이벤트를 처리합니다.

    protected override void OnNavigatedTo(NavigatedToEventArgs args)
        {
            base.OnNavigatedTo(args);
    
            Build();
    
    #if DEBUG
            HotReloadService.UpdateApplicationEvent += ReloadUI;
    #endif
        }
    
        protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
        {
            base.OnNavigatedFrom(args);
    
    #if DEBUG
            HotReloadService.UpdateApplicationEvent -= ReloadUI;
    #endif
        }
    
        private void ReloadUI(Type[] obj)
        {
            MainThread.BeginInvokeOnMainThread(() =>
            {
                Build();
            });
        }
    


    이제 시도해 보세요! 해당 페이지에서 C#을 변경하고 핫 리로드 실행 버튼을 누르십시오(또는 저와 같은 경우 저장 시 실행되도록 핫 리로드를 설정하십시오). 팔!

    XAML Hot Reload must be enabled to leverage this event since it works over the same tooling service. If you disable XAML Hot Reload, then your C# code will reload, but you won't receive the event that you have wired up now to trigger a UI rebuild.



    디버깅 세션을 실제로 중지했다가 다시 시작해야 하는 시나리오는 지금까지 거의 발견되지 않았습니다. 이 영상을 보시면 아시겠지만 저는 새로운 클래스 파일까지 멈추지 않고 추가합니다.

    좋은 웹페이지 즐겨찾기