.NET 9용 .NET MAUI의 새로운 기능

.NET 9에서 .NET 다중 플랫폼 앱 UI(.NET MAUI)의 초점은 제품 품질을 개선하는 것입니다. 여기에는 테스트 검사 확장, 종단 간 시나리오 테스트 및 버그 수정이 포함됩니다. .NET MAUI 9의 제품 품질 향상에 대한 자세한 내용은 다음 릴리스 정보를 참조하세요.

Important

Xcode 또는 Android SDK Tools와 같은 외부 종속성으로 인해 .NET MAUI 지원 정책은 .NET 및 .NET Core 지원 정책과 다릅니다. 자세한 내용은 .NET MAUI 지원 정책을 참조하세요.

.NET 9에서 .NET MAUI는 .NET 워크로드 및 여러 NuGet 패키지로 제공됩니다. 이 방법의 장점은 프로젝트를 특정 버전에 쉽게 고정하는 동시에 미공개 또는 실험적 빌드를 쉽게 미리 볼 수 있다는 점입니다. 새 .NET MAUI 프로젝트를 만들 때 필요한 NuGet 패키지가 프로젝트에 자동으로 추가됩니다.

최소 배포 대상

.NET MAUI 9에는 iOS 12.2 및 Mac Catalyst 15.0(macOS 12.0)의 최소 배포 대상이 필요합니다. Android 및 Windows 최소 배포 대상은 동일하게 유지됩니다. 자세한 내용은 .NET MAUI 앱에 대해 지원되는 플랫폼을 참조 하세요.

새 컨트롤

.NET MAUI 9에는 두 개의 새 컨트롤이 포함되어 있습니다.

HybridWebView

HybridWebView 에서는 웹 보기에서 임의의 HTML/JS/CSS 콘텐츠를 호스팅할 수 있으며 웹 보기의 코드(JavaScript)와 웹 보기를 호스트하는 코드(C#/.NET) 간의 통신을 사용하도록 설정합니다. 예를 들어 기존 React JS 앱이 있는 경우 플랫폼 간 .NET MAUI 네이티브 앱에서 호스트하고 C# 및 .NET을 사용하여 앱의 백 엔드를 빌드할 수 있습니다.

.NET MAUI 앱을 HybridWebView 빌드하려면 다음이 필요합니다.

  • 정적 HTML, JavaScript, CSS, 이미지 및 기타 파일로 구성된 앱의 웹 콘텐츠입니다.
  • HybridWebView 앱 UI의 일부인 컨트롤입니다. 이 작업은 앱의 XAML에서 참조하여 수행할 수 있습니다.
  • API를 사용하여 HybridWebView 두 구성 요소 간에 메시지를 보내는 웹 콘텐츠 및 C#/.NET의 코드입니다.

웹 콘텐츠를 포함한 전체 앱은 패키지되고 디바이스에서 로컬로 실행되며 해당 앱 스토어에 게시할 수 있습니다. 웹 콘텐츠는 네이티브 웹 보기 컨트롤 내에서 호스트되고 앱의 컨텍스트 내에서 실행됩니다. 앱의 모든 부분은 외부 웹 서비스에 액세스할 수 있지만 필요하지는 않습니다.

자세한 내용은 HybridWebView를 참조 하세요.

Windows용 제목 표시줄

이 컨트롤은 TitleBar Windows에서 앱에 사용자 지정 제목 표시줄을 추가하는 기능을 제공합니다.

.NET MAUI 제목 표시줄 개요.

A는 TitleBar 다음의 속성 값 Window.TitleBar 으로 설정할 수 있습니다 Window.

<Window.TitleBar>
    <TitleBar x:Name="TeamsTitleBar"
              Title="Hello World"
              Icon="appicon.png"
              HeightRequest="46">
        <TitleBar.Content>
            <Entry x:Name="SearchTitleBar"
                   Placeholder="Search"
                   VerticalOptions="Center"
                   MinimumWidthRequest="300"
                   MaximumWidthRequest="450"
                   HeightRequest="32"/>
        </TitleBar.Content>
    </TitleBar>
</Window.TitleBar>

C#에서 사용하는 예제는 다음과 같습니다.

Window.TitleBar = new TitleBar
{
    Title = "MAUI App",
    Icon = "appicon.png",
    HeightRequest = 46,
    LeadingContent = new AvatarButton()
};

A TitleBar 는 해당 Content, LeadingContentTrailingContent 속성을 통해 매우 사용자 지정할 수 있습니다.

<TitleBar Title="My App"
          BackgroundColor="#512BD4"
          HeightRequest="48">
    <TitleBar.Content>
        <SearchBar Placeholder="Search"
                   MaximumWidthRequest="300"
                   HorizontalOptions="FillAndExpand"
                   VerticalOptions="Center" />
    </TitleBar.Content>
    <TitleBar.TrailingContent>
        <ImageButton HeightRequest="36"
                     WidthRequest="36"
                     BorderWidth="0"
                     Background="Transparent">
            <ImageButton.Source>
                <FontImageSource Size="16"
                                 Glyph="&#xE713;"
                                 FontFamily="SegoeMDL2"/>
            </ImageButton.Source>
        </ImageButton>
    </TitleBar.TrailingContent>
</TitleBar>

다음 스크린샷은 결과 모양을 보여줍니다.

.NET MAUI 제목 표시줄 스크린샷

참고 항목

컨트롤에 TitleBar 대한 Mac Catalyst 지원은 향후 릴리스에서 추가될 예정입니다.

향상된 컨트롤

.NET MAUI 9에는 향상된 컨트롤 기능이 포함되어 있습니다.

BackButtonBehavior OneWay 바인딩 모드

이제 BindingMode.OneWay BindingMode.OneTime셸 앱에 대한 IsEnabled IsVisible BackButtonBehavior 바인딩 모드가 . 이렇게 하면 데이터 바인딩을 사용하여 런타임 시 뒤로 단추의 동작을 보다 쉽게 제어할 수 있습니다.

<ContentPage ...>    
    <Shell.BackButtonBehavior>
        <BackButtonBehavior Command="{Binding BackCommand}"
                            IsVisible="{Binding IsBackButtonVisible}"
                            IconOverride="back.png" />   
    </Shell.BackButtonBehavior>
    ...
</ContentPage>

BlazorWebView

iOS 및 Mac Catalyst 18에서 .NET MAUI 9는 콘텐츠를 호스트하는 기본 동작을 <a0/>BlazorWebView로 변경합니다. 콘텐츠를 호스트하는 데 사용되는 내부 0.0.0.0 주소는 더 이상 작동하지 BlazorWebView 않으므로 콘텐츠를 로드하지 않고 빈 사각형으로 렌더링됩니다.

주소 사용을 0.0.0.0 옵트인하려면 MauiProgram.cs 메서드에 CreateMauiApp 다음 코드를 추가합니다.

// Set this switch to use the LEGACY behavior of always using 0.0.0.0 to host BlazorWebView
AppContext.SetSwitch("BlazorWebView.AppHostAddressAlways0000", true);

Android BlazorWebView 에서 중단이 발생하는 경우 클래스의 메서드 MauiProgram 에서 스위치를 AppContext CreateMauiApp 사용하도록 설정해야 합니다.

AppContext.SetSwitch("BlazorWebView.AndroidFireAndForgetAsync", true);

이 스위치를 BlazorWebView 사용하면 발생하는 비동기 삭제를 실행하고 잊어버릴 수 있으며, 그 결과 Android에서 발생하는 대부분의 삭제 교착 상태가 수정됩니다. 자세한 내용은 Android에서 삭제 교착 상태 수정을 참조 하세요.

CollectionView 및 CarouselView

.NET MAUI 9에는 성능 및 안정성 향상을 가져오는 iOS 및 Mac Catalyst의 두 가지 선택적 새 처리기가 포함되어 있습니다 CollectionView CarouselView. 이러한 처리기는 API를 기반으로 UICollectionView 합니다.

이러한 처리기 사용을 옵트인하려면 클래스에 다음 코드를 추가합니다 MauiProgram .

#if IOS || MACCATALYST
builder.ConfigureMauiHandlers(handlers =>
{
    handlers.AddHandler<Microsoft.Maui.Controls.CollectionView, Microsoft.Maui.Controls.Handlers.Items2.CollectionViewHandler2>();
    handlers.AddHandler<Microsoft.Maui.Controls.CarouselView, Microsoft.Maui.Controls.Handlers.Items2.CarouselViewHandler2>();
});
#endif

ContentPage

.NET MAUI 9 HideSoftInputOnTapped 에서 이 속성은 Mac Catalyst와 Android 및 iOS에서도 지원됩니다.

소프트 키보드 입력 지원

.NET MAUI 9는 , DateTime에 대한 Password새로운 소프트 키보드 입력 지원을 추가합니다. 다음을 사용하도록 설정하고 Editor Entry 제어할 수 있습니다.

<Entry Keyboard="Date" />

Text alignment

열거형은 TextAlignment 텍스트 컨트롤의 Justify 텍스트를 정렬하는 데 사용할 수 있는 멤버를 추가합니다. 예를 들어 다음과 같이 HorizontalTextAlignment.Justify텍스트를 가로로 맞출 수 있습니다.Label

<Label Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. In facilisis nulla eu felis fringilla vulputate."
       HorizontalTextAlignment="Justify"/>

TimePicker

TimePickerTimeSelected 선택한 시간이 변경될 때 발생하는 이벤트를 가져옵니다. TimeChangedEventArgs 이벤트 NewTime 와 함께 TimeSelected 제공되는 개체와 OldTime 새 시간과 이전 시간을 각각 지정하는 속성이 있습니다.

WebView

WebViewProcessTerminated 프로세스가 예기치 않게 종료될 때 WebView 발생하는 이벤트를 추가합니다. 이 이벤트와 함께 제공되는 개체는 WebViewProcessTerminatedEventArgs 프로세스가 실패한 이유를 나타내는 플랫폼별 속성을 정의합니다.

앱 수명 주기

.NET MAUI 9는 iOS 및 Mac Catalyst에 다음과 같은 원격 알림 수명 주기 메서드를 추가합니다.

  • RegisteredForRemoteNotifications- 앱이 원격 알림에 성공적으로 등록되었을 때 호출됩니다.
  • ReceivedRemoteNotifications원격 알림을 받을 때 호출되는 입니다.

다음 예제에서는 이러한 수명 주기 메서드를 사용하는 방법을 보여 줍니다.

using Microsoft.Maui.LifecycleEvents;

namespace PlatformLifecycleDemo;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureLifecycleEvents(events =>
            {
#if IOS || MACCATALYST
                events.AddiOS(ios => ios
                    .ReceivedRemoteNotifications((app, dictionary) => LogEvent(nameof(iOSLifecycle.OnReceivedRemoteNotifications)))
                    .RegisteredForRemoteNotifications((app, data) => LogEvent(nameof(iOSLifecycle.OnRegisteredForRemoteNotifications)));
#endif
                static bool LogEvent(string eventName, string type = null)
                {
                    System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                    return true;
                }
            });

        return builder.Build();
    }
}

코드의 컴파일된 바인딩

코드로 작성된 바인딩은 일반적으로 리플렉션을 사용하여 런타임에 확인되는 문자열 경로를 사용하며, 이를 수행하는 오버헤드는 플랫폼마다 다릅니다. .NET MAUI 9에는 문자열 경로 대신 인수를 사용하여 바인딩을 Func 정의하는 추가 SetBinding 확장 메서드가 도입되었습니다.

// in .NET 8
MyLabel.SetBinding(Label.TextProperty, "Text");

// in .NET 9
MyLabel.SetBinding(Label.TextProperty, static (Entry entry) => entry.Text);

이 컴파일된 바인딩 접근 방식은 다음과 같은 이점을 제공합니다.

  • 런타임이 아닌 컴파일 시간에 바인딩 식을 확인하여 데이터 바인딩 성능을 향상시켰습니다.
  • 잘못된 바인딩이 빌드 오류로 보고되므로 개발자 문제 해결 환경이 향상됩니다.
  • 편집하는 동안 Intellisense.

컴파일된 바인딩을 정의하는 데 모든 메서드를 사용할 수 있는 것은 아닙니다. 식은 단순 속성 액세스 식이어야 합니다. 다음 예제에서는 유효하고 잘못된 바인딩 식을 보여 줍니다.

// Valid: Property access
static (PersonViewModel vm) => vm.Name;
static (PersonViewModel vm) => vm.Address?.Street;

// Valid: Array and indexer access
static (PersonViewModel vm) => vm.PhoneNumbers[0];
static (PersonViewModel vm) => vm.Config["Font"];

// Valid: Casts
static (Label label) => (label.BindingContext as PersonViewModel).Name;
static (Label label) => ((PersonViewModel)label.BindingContext).Name;

// Invalid: Method calls
static (PersonViewModel vm) => vm.GetAddress();
static (PersonViewModel vm) => vm.Address?.ToString();

// Invalid: Complex expressions
static (PersonViewModel vm) => vm.Address?.Street + " " + vm.Address?.City;
static (PersonViewModel vm) => $"Name: {vm.Name}";

또한 .NET MAUI 9는 개체에 직접 바인딩을 설정하고 바인딩 개체 인스턴스를 반환하는 메서드를 Func추가 Binding.Create 합니다.

// in .NET 8
myEntry.SetBinding(Entry.TextProperty, new MultiBinding
{
    Bindings = new Collection<BindingBase>
    {
        new Binding(nameof(Entry.FontFamily), source: RelativeBindingSource.Self),
        new Binding(nameof(Entry.FontSize), source: RelativeBindingSource.Self),
        new Binding(nameof(Entry.FontAttributes), source: RelativeBindingSource.Self),
    },
    Converter = new StringConcatenationConverter()
});

// in .NET 9
myEntry.SetBinding(Entry.TextProperty, new MultiBinding
{
    Bindings = new Collection<BindingBase>
    {
        Binding.Create(static (Entry entry) => entry.FontFamily, source: RelativeBindingSource.Self),
        Binding.Create(static (Entry entry) => entry.FontSize, source: RelativeBindingSource.Self),
        Binding.Create(static (Entry entry) => entry.FontAttributes, source: RelativeBindingSource.Self),
    },
    Converter = new StringConcatenationConverter()
});

Important

컴파일된 바인딩은 NativeAOT 앱의 문자열 기반 바인딩 대신, 전체 트리밍이 사용하도록 설정된 앱에서 필요합니다.

XAML의 컴파일된 바인딩

.NET MAUI 8에서는 속성을 정의하는 Source 모든 XAML 바인딩 식에 대해 컴파일된 바인딩을 사용할 수 없으며 다중 바인딩에서 지원되지 않습니다. 이러한 제한 사항은 .NET MAUI 9에서 제거되었습니다.

기본적으로 .NET MAUI는 앱에 NativeAOT를 사용하도록 설정하지 않은 한 컴파일된 바인딩을 사용하지 않는 바인딩에 대한 빌드 경고를 생성하지 않습니다. 그러나 빌드 속성을 앱의 프로젝트 파일(*.csproj)로 설정 $(MauiStrictXamlCompilation) 하여 생성되는 컴파일된 바인딩 경고를 옵트인할 true 수 있습니다.

<MauiStrictXamlCompilation>true</MauiStrictXamlCompilation>

처리기 연결 끊기

처리기를 사용하여 사용자 지정 컨트롤을 구현하는 경우 이벤트 구독 취소와 같은 네이티브 뷰 정리를 수행하려면 메서드를 구현 DisconnectHandler 하기 위해 모든 플랫폼 처리기 구현이 필요합니다. 그러나 .NET MAUI 9 DisconnectHandler 이전에는 구현이 의도적으로 .NET MAUI에서 호출되지 않습니다. 대신 앱에서 뒤로 탐색하는 경우와 같이 컨트롤을 정리하도록 선택할 때 직접 호출해야 합니다.

.NET MAUI 9에서 처리기는 가능하면 앱에서 뒤로 탐색하는 경우와 같이 컨트롤의 연결을 자동으로 끊습니다. 일부 시나리오에서는 이 동작을 원하지 않을 수 있습니다. 따라서 .NET MAUI 9는 처리기가 컨트롤과 연결이 끊어진 시기를 제어하기 위해 연결된 속성을 추가 HandlerProperties.DisconnectPolicy 합니다. 이 속성에는 HandlerDisconnectPolicy 다음 값을 정의하는 열거형과 함께 HandlerDisconnectPolicy 인수가 필요합니다.

  • Automatic- 처리기의 연결이 자동으로 끊어지게 됨을 나타냅니다. 이 값은 HandlerProperties.DisconnectPolicy 연결된 속성의 기본값입니다.
  • Manual- 구현을 호출하여 처리기의 연결을 수동으로 끊어야 했음을 DisconnectHandler 나타냅니다.

다음 예제에서는 연결된 속성을 설정하는 방법을 HandlerProperties.DisconnectPolicy 보여줍니다.

<controls:Video x:Name="video"
                HandlerProperties.DisconnectPolicy="Manual"
                Source="video.mp4"
                AutoPlay="False" />

해당하는 C# 코드는 다음과 같습니다.

Video video = new Video
{
    Source = "video.mp4",
    AutoPlay = false
};
HandlerProperties.SetDisconnectPolicy(video, HandlerDisconnectPolicy.Manual);

또한 DisconnectHandlers 지정된 IView처리기의 연결을 끊는 확장 메서드가 있습니다.

video.DisconnectHandlers();

연결을 끊을 때 메서드는 DisconnectHandlers 수동 정책을 설정한 컨트롤이 완료되거나 도착할 때까지 컨트롤 트리 아래로 전파됩니다.

다중 창 지원

.NET MAUI 9는 다음과 같은 방법으로 Mac Catalyst 및 Windows Application.Current.ActivateWindow 의 전면에 특정 창을 가져올 수 있는 기능을 추가합니다.

Application.Current?.ActivateWindow(windowToActivate);

네이티브 포함

.NET MAUI 9에는 이전에 프로젝트에 수동으로 추가해야 했던 네이티브 포함 시나리오에 대한 전체 API가 포함되어 있습니다.

var mauiApp = MauiProgram.CreateMauiApp();

#if ANDROID
var mauiContext = new MauiContext(mauiApp.Services, window);
#else
var mauiContext = new MauiContext(mauiApp.Services);
#endif

var mauiView = new MyMauiContent();
var nativeView = mauiView.ToPlatform(mauiContext);

또는 이 메서드를 ToPlatformEmbedded 사용하여 앱이 Window 실행 중인 플랫폼에 전달할 수 있습니다.

var mauiApp = MauiProgram.CreateMauiApp();
var mauiView = new MyMauiContent();
var nativeView = mauiView.ToPlatformEmbedded(mauiApp, window);

두 예제 nativeView 모두 플랫폼별 버전입니다 mauiView.

.NET MAUI 9에서 네이티브 임베디드 앱을 부트스트랩하려면 개체에서 UseMauiEmbeddedApp 확장 메서드를 호출합니다 MauiAppBuilder .

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();

        builder
            .UseMauiEmbeddedApp<App>();

        return builder.Build();
    }
}

프로젝트 템플릿

.NET MAUI 9는 Razor 클래스 라이브러리 프로젝트에서 공통 코드를 공유하는 Blazor 웹앱이 있는 .NET MAUI Blazor 하이브리드 앱으로 솔루션을 만드는 .NET MAUI Blazor 하이브리드 및 웹앱 프로젝트 템플릿을 Visual Studio에 추가합니다.

템플릿은 다음에서 사용할 수도 있습니다.dotnew new

dotnet new maui-blazor-web -n AllTheTargets

리소스 사전

.NET MAUI 9에서 독립 실행형 XAML ResourceDictionary (코드 숨김 파일에서 지원되지 않음)은 기본적으로 XAML을 컴파일하도록 합니다. 이 동작을 옵트아웃하려면 XML 헤더 뒤를 지정 <?xaml-comp compile="false" ?> 합니다.

트리밍 기능 스위치

.NET MAUI의 여러 영역에는 기능 스위치라고 하는 트리머 지시문이 함께 제공되므로 NativeAOT뿐만 아니라 사용 안 함 기능에 TrimMode=full대한 코드를 제거할 수 있습니다.

MSBuild 속성 설명
MauiEnableVisualAssemblyScanning 로 설정 true하면 .NET MAUI는 어셈블리에서 구현하는 IVisual 형식 및 특성에 대해 [assembly:Visual(...)] 검색하고 이러한 형식을 등록합니다. 기본적으로 이 빌드 속성은 .로 설정됩니다 false.
MauiShellSearchResultsRendererDisplayMemberNameSupported false설정하면 값 SearchHandler.DisplayMemberName 이 무시됩니다. 대신 결과의 모양을 SearchHandler 정의하는 방법을 제공해야 ItemTemplate 합니다. 기본적으로 이 빌드 속성은 .로 설정됩니다 true.
MauiQueryPropertyAttributeSupport false[QueryProperty(...)] 설정하면 탐색할 때 특성이 속성 값을 설정하는 데 사용되지 않습니다. 대신 쿼리 매개 변수를 IQueryAttributable 허용하는 인터페이스를 구현해야 합니다. 기본적으로 이 빌드 속성은 .로 설정됩니다 true.
MauiImplicitCastOperatorsUsageViaReflectionSupport 로 설정 false하면 값을 한 형식에서 다른 형식으로 변환할 때 .NET MAUI에서 암시적 캐스트 연산자를 찾을 수 없습니다. 이는 형식이 다른 속성 간의 바인딩과 다른 형식의 값으로 바인딩 가능한 개체의 속성 값을 설정하는 데 영향을 줄 수 있습니다. 대신, 형식에 TypeConverter 대해 정의하고 특성을 사용하여 형식에 [TypeConverter(typeof(MyTypeConverter))] 연결해야 합니다. 기본적으로 이 빌드 속성은 .로 설정됩니다 true.
_MauiBindingInterceptorsSupport 로 설정 false하면 .NET MAUI는 메서드에 대한 호출을 SetBinding 가로채지 않으며 컴파일을 시도하지 않습니다. 기본적으로 이 빌드 속성은 .로 설정됩니다 true.

기능 스위치를 사용하려면 해당 MSBuild 속성을 앱의 프로젝트 파일(*.csproj)에 배치해야 합니다. 그러면 관련 코드가 .NET MAUI 어셈블리에서 잘립니다. 앱에 필요하지 않은 기능을 사용하지 않도록 설정하면 트리밍 모드와 Full 결합할 때 앱 크기를 줄이는 데 도움이 될 수 있습니다.

XAML

IMarkupExtension<T>IValueProvider구현IMarkupExtension하고 IExtendedTypeConverter 또는 .로 주석 AcceptEmptyServiceProviderAttributeRequireServiceAttribute 을 추가해야 하는 모든 클래스 이는 앱 크기를 줄이고 런타임 성능을 향상시키는 데 도움이 되는 보다 효율적인 코드를 생성할 수 있도록 .NET MAUI 9에 도입된 XAML 컴파일러 최적화로 인해 필요합니다.

이러한 특성으로 태그 확장에 주석을 지정하는 방법에 대한 자세한 내용은 서비스 공급자를 참조 하세요.

Xcode 동기화

.NET MAUI 9에는 자산 카탈로그, plist 파일, 스토리보드 및 xib 파일을 포함하여 .NET 프로젝트로 Apple 특정 파일을 관리하기 위해 Xcode를 사용할 수 있는 도구인 Xcode 동기화(xcsync)가 포함되어 있습니다. 이 도구에는 .NET 프로젝트에서 임시 Xcode 프로젝트를 생성하고 Xcode 파일의 변경 내용을 .NET 프로젝트로 다시 동기화하는 두 가지 기본 명령이 있습니다.

또는 xcsync-sync 명령을 사용하여 dotnet build xcsync-generate 이러한 파일을 생성하거나 동기화하고 프로젝트 파일 및 추가 인수를 전달합니다.

dotnet build /t:xcsync-generate
    /p:xcSyncProjectFile=<PROJECT>
    /p:xcSyncXcodeFolder=<TARGET_XCODE_DIRECTORY>
    /p:xcSyncTargetFrameworkMoniker=<FRAMEWORK>
    /p:xcSyncVerbosity=<LEVEL>

자세한 내용은 Xcode 동기화를 참조하세요.

사용되지 않는 API

.NET MAUI 9는 일부 API를 더 이상 사용하지 않으며 향후 릴리스에서 완전히 제거될 예정입니다.

Frame

컨트롤은 Frame .NET MAUI 9에서 사용되지 않는 것으로 표시되며 향후 릴리스에서 완전히 제거될 예정입니다. 컨트롤을 Border 해당 위치에 사용해야 합니다. 자세한 내용은 테두리를 참조 하세요.

MainPage

개체의 속성을 Application 사용하여 MainPage 앱의 첫 번째 페이지를 정의하는 대신 앱의 첫 번째 페이지로 Window 속성을 설정 Page 해야 합니다. 이는 속성을 설정할 MainPage 때 .NET MAUI에서 내부적으로 수행되므로 사용되지 않는 것으로 표시된 속성에서 MainPage 발생하는 동작 변경이 없습니다.

다음 예제에서는 재정의를 Page Window통해 CreateWindow 속성의 설정을 보여줍니다.

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
    }

    protected override Window CreateWindow(IActivationState? activationState)
    {
        return new Window(new AppShell());
    }
}

MainPage 속성은 .NET MAUI 9에 대해 보존되지만 향후 릴리스에서 완전히 제거될 예정입니다.

호환성 레이아웃

네임스페이스의 Microsoft.Maui.Controls.Compatibility 호환성 레이아웃 클래스가 사용되지 않았습니다.

레거시 측정값 호출

다음 VisualElement 레거시 측정값 메서드는 사용되지 않습니다.

  • protected override SizeRequest OnMeasure(double widthConstraint, double heightConstraint).
  • public virtual SizeRequest Measure(double widthConstraint, double heightConstraint, MeasureFlags flags = MeasureFlags.None)에서 VisualElement

대체 방법으로 다음 메서드가 도입되었습니다.

  • public size Measure(double widthConstraint, double heightConstraint)

Measure 메서드는 디바이스에 표시하기 위해 요소에 필요한 최소 크기를 반환합니다. 여백은 측정값에서 제외되지만 크기로 반환됩니다. 보기를 측정할 때 호출하는 기본 메서드입니다.

또한 Microsoft.Maui.SizeRequest 구조체는 사용되지 않습니다. 대신 Microsoft.Maui.Size 사용해야 합니다.

Android용 .NET

API 35에 대한 지원을 추가하는 Android 9용 .NET에는 빌드 시간을 줄이고 크기를 줄이고 성능을 향상시키기 위한 앱의 트리밍 기능을 개선하는 작업이 포함됩니다. Android 9용 .NET에 대한 자세한 내용은 다음 릴리스 정보를 참조하세요.

자산 팩

Android 9용 .NET에는 자산을 자산 팩이라고 하는 별도의 패키지에 배치하는 기능이 도입되었습니다. 이렇게 하면 일반적으로 Google Play에서 허용하는 기본 패키지 크기보다 큰 게임 및 앱을 업로드할 수 있습니다. 이러한 자산을 별도의 패키지에 배치하면 기본 패키지 크기가 200Mb가 아닌 최대 2Gb 크기의 패키지를 업로드할 수 있습니다.

Important

자산 팩은 자산만 포함할 수 있습니다. Android용 .NET의 경우 빌드 동작이 있는 AndroidAsset 항목을 의미합니다.

.NET MAUI 앱은 빌드 작업을 통해 MauiAsset 자산을 정의합니다. 자산 팩은 다음 특성을 통해 AssetPack 지정할 수 있습니다.

<MauiAsset
    Include="Resources\Raw\**"
    LogicalName="%(RecursiveDir)%(Filename)%(Extension)"
    AssetPack="myassetpack" />

참고 항목

추가 메타데이터는 다른 플랫폼에서 무시됩니다.

자산 팩에 배치하려는 특정 항목이 있는 경우 특성을 사용하여 Update 메타데이터를 AssetPack 정의할 수 있습니다.

<MauiAsset Update="Resources\Raw\MyLargeAsset.txt" AssetPack="myassetpack" />

자산 팩에는 디바이스에 자산이 설치되는 시기를 제어하는 다양한 배달 옵션이 있을 수 있습니다.

  • 설치 시간 팩은 앱과 동시에 설치됩니다. 이 팩 유형은 최대 1Gb 크기일 수 있지만 그 중 하나만 사용할 수 있습니다. 이 배달 유형은 메타데이터로 InstallTime 지정됩니다.
  • 빠른 팔로우 팩은 앱 설치가 완료된 직후에 설치됩니다. 이 유형의 팩이 설치되는 동안 앱을 시작할 수 있으므로 자산을 사용하기 전에 설치가 완료되었는지 확인해야 합니다. 이러한 종류의 자산 팩 크기는 최대 512Mb일 수 있습니다. 이 배달 유형은 메타데이터로 FastFollow 지정됩니다.
  • 앱이 특별히 요청하지 않는 한 주문형 팩은 디바이스에 다운로드되지 않습니다. 모든 자산 팩의 총 크기는 2Gb를 초과할 수 없으며 최대 50개의 개별 자산 팩을 가질 수 있습니다. 이 배달 유형은 메타데이터로 OnDemand 지정됩니다.

.NET MAUI 앱에서 배달 유형은 다음의 특성MauiAsset으로 DeliveryType 지정할 수 있습니다.

<MauiAsset Update="Resources\Raw\myvideo.mp4" AssetPack="myassetpack" DeliveryType="FastFollow" />

Android 자산 팩에 대한 자세한 내용은 Android 자산 팩을 참조 하세요.

Android 15 지원

Android 9용 .NET은 Android 15(API 35)용 .NET 바인딩을 추가합니다. 이러한 API를 빌드하려면 프로젝트의 대상 프레임워크를 업데이트합니다.

<TargetFramework>net9.0-android35</TargetFramework>

LLVM 마샬링된 메서드

LLVM(하위 수준 Virtual Machine) 마샬링된 메서드는 이제 Blazor가 아닌 앱의 Android 9용 .NET에서 기본적으로 사용하도록 설정됩니다. 이로 인해 테스트 앱의 성능이 10% 향상되었습니다.

LLVM 마샬링된 메서드는 프로젝트 파일(.csproj)에서 사용하지 않도록 설정할 수 있습니다.

<PropertyGroup Condition="'$(TargetFramework)' == 'net9.0-android'">
    <AndroidEnableLLVM>false</AndroidEnableLLVM>
    <AndroidEnableLLVMOptimizations>false</AndroidEnableLLVMOptimizations>
</PropertyGroup>

향상된 트리밍 기능

Android 9용 .NET에는 전체 트리밍을 사용하여 앱 크기를 줄이는 경우에 대한 수정 사항이 포함되어 있습니다. 전체 트리밍은 일반적으로 앱의 릴리스 빌드에 대해서만 사용하도록 설정되며 프로젝트 파일(.csproj)에서 구성할 수 있습니다.

<PropertyGroup Condition="'$(Configuration)' == 'Release' And '$(TargetFramework)' == 'net9.0-android'">
    <TrimMode>Full</TrimMode>
</PropertyGroup>

iOS용 .NET

iOS, tvOS, Mac Catalyst 및 macOS의 .NET 9는 다음 플랫폼 버전에 Xcode 15.4를 사용합니다.

  • iOS: 17.5
  • tvOS: 17.5
  • Mac Catalyst: 17.5
  • macOS: 14.5

iOS, tvOS, Mac Catalyst 및 macOS의 .NET 9에 대한 자세한 내용은 다음 릴리스 정보를 참조하세요.

바인딩

iOS 9용 .NET에는 iOS 바인딩용 .NET의 다중 대상 버전을 사용하는 기능이 도입되었습니다. 예를 들어 라이브러리 프로젝트는 두 가지 고유한 iOS 버전에 대해 빌드해야 할 수 있습니다.

<TargetFrameworks>net9.0-ios17.0;net9.0-ios17.2</TargetFrameworks>

이렇게 하면 두 개의 라이브러리가 생성됩니다. 하나는 iOS 17.0 바인딩을 사용하고 다른 하나는 iOS 17.2 바인딩을 사용합니다.

Important

앱 프로젝트는 항상 최신 iOS SDK를 대상으로 해야 합니다.

iOS 및 Mac Catalyst용 네이티브 AOT

iOS 9용 .NET에서 iOS 및 Mac Catalyst용 네이티브 AOT(Ahead of Time) 컴파일은 전체 트리밍을 활용하여 앱의 패키지 크기 및 시작 성능을 줄입니다. 이 기능은 앱을 배송할 준비가 되면 사용할 수 있는 게시 기능입니다.

Important

이 기능을 활용하려면 앱과 종속성이 완전히 잘려야 합니다.

참고 항목