Share via


C# 태그 핫 다시 로드

기본 사용법

.NET 핫 다시 로드 사용하려면 .NET MAUI 앱을 적극적으로 디버깅하는 동안 C# 코드를 수정한 다음 Visual Studio 도구 모음에서 코드 변경 내용 적용 단추(예: 🔥 단추)를 클릭합니다.

C# Hot Reload Demo

Warning

UI 코드를 수정할 때 코드 변경 내용 적용 단추(즉🔥, 단추)는 실행 중인 C# 코드를 즉시 업데이트하지만 UI를 즉시 업데이트하지 않을 수 있습니다(고급 사용 참조). .NET MAUI는 방금 실행 중인 중간 언어에 대한 기본 변경 내용을 인식하지 못하기 때문입니다.

좋은 소식은 실행 중인 코드가 실제로 업데이트되었다는 것입니다. 업데이트된 UI를 화면에 다시 그리도록 .NET MAUI에 알려야 합니다.

쉬운 해결 방법은 .NET 핫 다시 로드 변경이 적용된 현재 페이지에서 벗어나 해당 페이지로 다시 이동하여 .NET MAUI가 UI를 업데이트하도록 강제하는 것입니다. 이렇게 하면 .NET MAUI가 화면에서 UI를 다시 그릴 수 있습니다.

업데이트된 UI를 다시 그리도록 .NET MAUI에 자동으로 지시하는 방법에 대한 자세한 내용은 고급 사용을 참조하세요.

고급 사용량

.NET MAUI와 .NET 핫 다시 로드 간에 .NET 에코시스템에 차이가 있습니다. .NET MAUI 앱 UI는 코드 변경 내용 적용 단추(즉🔥, 단추)를 누른 후 자동으로 새로 고쳐지지 않습니다. 코드가 앱의 기본 중간 언어로 업데이트되었지만 .NET MAUI가 화면에서 업데이트된 UI를 다시 그리라고 말한 것은 없습니다.

좋은 소식은 .NET MAUI의 종속성 주입 컨테이너(아래 예제)를 구현 ICommunityToolkitHotReloadHandler 하고 등록하여 UI를 다시 그리도록 .NET MAUI에 수동으로 지시할 수 있다는 것입니다.

MetadataUpdateHandler

.NET 핫 다시 로드 실행되면 을 통해 System.Reflection.Metadata.MetadataUpdateHandler업데이트 Type 된 각 화면이 Type[] 표시됩니다.

.NET MAUI C# 태그 커뮤니티 도구 키트는 을 통해 ICommunityToolkitHotReloadHandler.OnHotReload(IReadOnlyList<Type> types)변경된 형식을 표시합니다.

.NET MAUI의 종속성 주입 컨테이너에 구현 ICommunityToolkitHotReloadHandler 을 등록하면 OnHotReload 코드 변경 내용 적용 단추(예: 단추)를 누를 때마다 메서드가 🔥 자동으로 실행됩니다.

builder.Services.AddSingleton<ICommunityToolkitHotReloadHandler, HotReloadHandler>();

의 구현 예 ICommunityToolkitHotReloadHandler

이 예제에서는 코드 변경 내용 적용 단추(예: 단추)를 누를 때 앱 UI를 자동으로 다시 그리도록 .NET MAUI에 🔥 지시하는 방법을 보여 ICommunityToolkitHotReloadHandler 줍니다.

참고 항목

이는 모든 앱에 대해 작동하는 포괄적인 예제가 아닙니다. 이 예제는 대부분의 앱에서 작동하지만 모든 .NET MAUI 앱이 설계되고 다르게 구현되므로 코드 베이스에 가장 적합하도록 예제 코드를 수정하는 것이 좋습니다.

MauiProgram.cs

MauiProgram.cs .NET MAUI의 ICommunityToolkitHotReloadHandler 종속성 주입 컨테이너에 구현을 추가합니다.

public class MauiProgram
{
	public static MauiApp CreateMauiApp()
	{
		// ...
        // Additional code ommitted for brevity
        // ...

		// Register C# Hot Reload Handler
		builder.Services.AddSingleton<ICommunityToolkitHotReloadHandler, HotReloadHandler>();

		// ...
        // Additional code ommitted for brevity
        // ...
	}
}

HotReloadHandler.cs

구현 ICommunityToolkitHotReloadHandler에서는 .NET MAUI에 화면에서 UI를 다시 그리도록 지시합니다.

아래 예제에서는 셸 아키텍처와 비셸 아키텍처를 모두 처리하고 모듈식으로 표시되는 페이지에 대한 지원을 포함합니다.

참고 항목

이는 모든 앱에 대해 작동하는 포괄적인 예제가 아닙니다. 이 예제는 대부분의 앱에서 작동하지만 모든 .NET MAUI 앱이 설계되고 다르게 구현되므로 코드 베이스에 가장 적합하도록 예제 코드를 수정하는 것이 좋습니다.

using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;

namespace CommunityToolkit.Maui.Markup.Sample;

class HotReloadHandler : ICommunityToolkitHotReloadHandler
{
	public async void OnHotReload(IReadOnlyList<Type> types)
	{
		if (Application.Current?.Windows is null)
		{
			Trace.WriteLine($"{nameof(HotReloadHandler)} Failed: {nameof(Application)}.{nameof(Application.Current)}.{nameof(Application.Current.Windows)} is null");
			return;
		}

		foreach (var window in Application.Current.Windows)
		{
			if (window.Page is not Page currentPage)
			{
				return;
			}

			foreach (var type in types)
			{
				if (type.IsSubclassOf(typeof(Page)))
				{
					if (window.Page is AppShell shell)
					{
						if (shell.CurrentPage is Page visiblePage
							&& visiblePage.GetType() == type)
						{
							var currentPageShellRoute = AppShell.GetRoute(type);

							await currentPage.Dispatcher.DispatchAsync(async () =>
							{
								await shell.GoToAsync(currentPageShellRoute, false);
								shell.Navigation.RemovePage(visiblePage);
							});

							break;
						}
					}
					else
					{
						if (TryGetModalStackPage(window, out var modalPage))
						{
							await currentPage.Dispatcher.DispatchAsync(async () =>
							{
								await currentPage.Navigation.PopModalAsync(false);
								await currentPage.Navigation.PushModalAsync(modalPage, false);
							});
						}
						else
						{
							await currentPage.Dispatcher.DispatchAsync(async () =>
							{
								await currentPage.Navigation.PopAsync(false);
								await currentPage.Navigation.PushAsync(modalPage, false);
							});
						}

						break;
					}
				}
			}
		}
	}


	static bool TryGetModalStackPage(Window window, [NotNullWhen(true)] out Page? page)
	{
		page = window.Navigation.ModalStack.LastOrDefault();
		return page is not null;
	}
}