Apa yang baru di .NET MAUI untuk .NET 9
Fokus UI Aplikasi Multi-platform .NET (.NET MAUI) di .NET 9 adalah untuk meningkatkan kualitas produk. Ini termasuk memperluas cakupan pengujian, pengujian skenario ujung ke ujung, dan perbaikan bug. Untuk informasi selengkapnya tentang peningkatan kualitas produk di .NET MAUI 9, lihat catatan rilis berikut:
- .NET MAUI 9
- .NET MAUI 9 RC2
- .NET MAUI 9 RC1
- Pratinjau .NET MAUI 9 7
- Pratinjau .NET MAUI 9 6
- Pratinjau .NET MAUI 9 5
- Pratinjau .NET MAUI 9 4
- Pratinjau .NET MAUI 9 3
- Pratinjau .NET MAUI 9 2
- Pratinjau .NET MAUI 9 1
Penting
Karena bekerja dengan dependensi eksternal, seperti Xcode atau Android SDK Tools, kebijakan dukungan .NET MAUI berbeda dari kebijakan dukungan .NET dan .NET Core. Untuk informasi selengkapnya, lihat Kebijakan dukungan .NET MAUI.
Kompatibilitas dengan Xcode 16, yang mencakup dukungan SDK untuk iOS 18, iPadOS 18, tvOS 18, dan macOS 15, diperlukan saat membangun dengan .NET MAUI 9. Xcode 16 memerlukan Mac yang menjalankan macOS 14.5 atau yang lebih baru.
Di .NET 9, .NET MAUI dikirim sebagai beban kerja .NET dan beberapa paket NuGet. Keuntungan dari pendekatan ini adalah memungkinkan Anda untuk dengan mudah menyematkan proyek Anda ke versi tertentu, sekaligus memungkinkan Anda untuk dengan mudah mempratinjau build yang belum dilepas atau eksperimental. Saat Anda membuat proyek .NET MAUI baru, paket NuGet yang diperlukan secara otomatis ditambahkan ke proyek.
Target penyebaran minimum
.NET MAUI 9 memerlukan target penyebaran minimum iOS 12.2, dan Mac Catalyst 15.0 (macOS 12.0). Target penyebaran minimum Android dan Windows tetap sama. Untuk informasi selengkapnya, lihat Platform yang didukung untuk aplikasi .NET MAUI.
Kontrol baru
.NET MAUI 9 menyertakan dua kontrol baru.
HybridWebView
HybridWebView memungkinkan hosting konten HTML/JS/CSS arbitrer dalam tampilan web, dan memungkinkan komunikasi antara kode dalam tampilan web (JavaScript) dan kode yang menghosting tampilan web (C#/.NET). Misalnya, jika Anda memiliki aplikasi React JS yang ada, Anda dapat menghostingnya di aplikasi asli .NET MAUI lintas platform, dan membangun back-end aplikasi menggunakan C# dan .NET.
Untuk membangun aplikasi .NET MAUI dengan HybridWebView Anda memerlukan:
- Konten web aplikasi, yang terdiri dari HTML statis, JavaScript, CSS, gambar, dan file lainnya.
- HybridWebView Kontrol sebagai bagian dari UI aplikasi. Ini dapat dicapai dengan mereferensikannya di XAML aplikasi.
- Kode dalam konten web, dan di C#/.NET, yang menggunakan HybridWebView API untuk mengirim pesan di antara kedua komponen.
Seluruh aplikasi, termasuk konten web, dipaketkan dan dijalankan secara lokal di perangkat, dan dapat diterbitkan ke penyimpanan aplikasi yang berlaku. Konten web dihosting dalam kontrol tampilan web asli dan berjalan dalam konteks aplikasi. Bagian mana pun dari aplikasi dapat mengakses layanan web eksternal, tetapi tidak diperlukan.
Untuk informasi selengkapnya, lihat HybridWebView.
Bilah Judul untuk Windows
Kontrol ini TitleBar menyediakan kemampuan untuk menambahkan bilah judul kustom ke aplikasi Anda di Windows:
TitleBar dapat ditetapkan sebagai nilai Window.TitleBar properti pada setiap TitleBar:
<Window.TitleBar>
<TitleBar x:Name="TeamsTitleBar"
Title="Hello World"
Icon="appicon.png"
HeightRequest="46">
<TitleBar.Content>
<SearchBar Placeholder="Search"
PlaceholderColor="White"
MaximumWidthRequest="300"
HorizontalOptions="Fill"
VerticalOptions="Center" />
</TitleBar.Content>
</TitleBar>
</Window.TitleBar>
Contoh penggunaannya dalam C# adalah:
Window window = new Window
{
TitleBar = new TitleBar
{
Icon = "titlebar_icon.png"
Title = "My App",
Subtitle = "Demo"
Content = new SearchBar { ... }
}
};
A TitleBar sangat dapat disesuaikan melalui Contentproperti , , LeadingContentdan TrailingContent :
<TitleBar Title="My App"
BackgroundColor="#512BD4"
HeightRequest="48">
<TitleBar.Content>
<SearchBar Placeholder="Search"
MaximumWidthRequest="300"
HorizontalOptions="Fill"
VerticalOptions="Center" />
</TitleBar.Content>
<TitleBar.TrailingContent>
<ImageButton HeightRequest="36"
WidthRequest="36"
BorderWidth="0"
Background="Transparent">
<ImageButton.Source>
<FontImageSource Size="16"
Glyph=""
FontFamily="SegoeMDL2"/>
</ImageButton.Source>
</ImageButton>
</TitleBar.TrailingContent>
</TitleBar>
Cuplikan layar berikut menunjukkan tampilan yang dihasilkan:
Catatan
Dukungan Mac Catalyst untuk TitleBar
kontrol akan ditambahkan dalam rilis mendatang.
Untuk informasi selengkapnya, lihat Bilah Judul.
Penyempurnaan kontrol
.NET MAUI 9 mencakup peningkatan kontrol.
Mode pengikatan BackButtonBehavior OneWay
Mode pengikatan untuk IsVisible
dan IsEnabled
pada BackButtonBehavior di aplikasi Shell sekarang BindingMode.OneWay
bukan BindingMode.OneTime
. Ini memungkinkan Anda untuk lebih mudah mengontrol perilaku tombol kembali saat runtime, dengan pengikatan data:
<ContentPage ...>
<Shell.BackButtonBehavior>
<BackButtonBehavior Command="{Binding BackCommand}"
IsVisible="{Binding IsBackButtonVisible}"
IconOverride="back.png" />
</Shell.BackButtonBehavior>
...
</ContentPage>
BlazorWebView
Perilaku default untuk menghosting konten dalam BlazorWebView telah berubah menjadi 0.0.0.1
. Alamat internal 0.0.0.0
yang digunakan untuk menghosting konten tidak lagi berfungsi dan menghasilkan BlazorWebView tidak memuat konten apa pun dan penyajian sebagai persegi panjang kosong.
Untuk memilih menggunakan 0.0.0.0
alamat, tambahkan kode berikut ke CreateMauiApp
metode di MauiProgram.cs:
// Set this switch to use the LEGACY behavior of always using 0.0.0.0 to host BlazorWebView
AppContext.SetSwitch("BlazorWebView.AppHostAddressAlways0000", true);
Secara default, BlazorWebView sekarang menembak dan melupakan pembuangan asinkron dari yang mendasar WebViewManager
. Ini mengurangi potensi kebuntuan pembuangan terjadi di Android.
Peringatan
Perilaku default fire-and-forget ini berarti bahwa pembuangan dapat kembali sebelum semua objek dibuang, yang dapat menyebabkan perubahan perilaku di aplikasi Anda. Item yang dibuang sebagian adalah jenis internal Blazor sendiri, tetapi juga jenis yang ditentukan aplikasi seperti layanan tercakup yang digunakan dalam BlazorWebView bagian aplikasi Anda.
Untuk menolak perilaku ini, Anda harus mengonfigurasi aplikasi untuk memblokir pembuangan melalui sakelar AppContext dalam CreateMauiApp
metode di kelas Anda MauiProgram
:
AppContext.SetSwitch("BlazorWebView.AndroidFireAndForgetAsync", false);
Jika aplikasi Anda dikonfigurasi untuk memblokir pembuangan melalui sakelar ini, BlazorWebView lakukan pembuangan asinkron-over-sync, yang berarti bahwa aplikasi memblokir utas hingga pembuangan asinkron selesai. Namun, ini dapat menyebabkan kebuntuan jika pembuangan perlu menjalankan kode pada utas yang sama (karena utas diblokir saat menunggu).
Tombol di iOS
Button kontrol pada iOS sekarang menghormati penspasian, padding, lebar batas, dan margin lebih akurat daripada rilis sebelumnya. Gambar besar dalam Button sekarang akan diubah ukurannya menjadi ukuran maksimum, dengan mempertimbangkan spasi, padding, lebar batas, dan margin. Namun, jika berisi Button teks dan gambar, mungkin tidak mungkin untuk mencocokkan semua konten di dalam tombol, sehingga Anda harus mengukur gambar Anda secara manual untuk mencapai tata letak yang Anda inginkan.
CollectionView dan CarouselView
.NET MAUI 9 mencakup dua handler baru opsional di iOS dan Mac Catalyst yang menghadirkan peningkatan performa dan stabilitas ke CollectionView
dan CarouselView
. Handler ini didasarkan pada UICollectionView
API.
Untuk memilih menggunakan handler ini, tambahkan kode berikut ke kelas Anda 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
Di .NET MAUI 9, HideSoftInputOnTapped properti ini juga didukung di Mac Catalyst, serta Android dan iOS.
Perilaku fokus pada Windows
Di .NET MAUI 8 di Windows, peristiwa VisualElement.Focused, peristiwa VisualElement.Unfocused, dan properti VisualElement.IsFocused diterapkan ke elemen dan turunannya:
<VerticalStackLayout Focus="OnFocused">
<Entry />
<Editor />
</VerticalStackLayout>
Dalam contoh ini pada .NET 8, penanganan aktivitas OnFocused
dijalankan pada Windows ketika VerticalStackLayout, Entry, atau Editor mendapatkan fokus.
.NET MAUI 9 mengubah perilaku ini pada Windows agar identik dengan platform lain. Oleh karena itu, peristiwa VisualElement.Focused, peristiwa VisualElement.Unfocused, dan properti VisualElement.IsFocused hanya berlaku untuk elemen. Oleh karena itu, ketika contoh sebelumnya berjalan pada .NET 9, penanganan aktivitas OnFocused
tidak dijalankan karena hanya kontrol input yang dapat mendapatkan fokus.
Dukungan input keyboard lunak
.NET MAUI 9 menambahkan dukungan input keyboard lunak baru untuk Password
, , Date
dan Time
. Ini dapat diaktifkan dan EditorEntry kontrol:
<Entry Keyboard="Date" />
Perataan teks
Enumerasi TextAlignment menambahkan Justify
anggota yang dapat digunakan untuk meratakan teks dalam kontrol teks. Misalnya, Anda dapat meratakan teks secara horizontal dalam Label dengan HorizontalTextAlignment.Justify
:
<Label Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. In facilisis nulla eu felis fringilla vulputate."
HorizontalTextAlignment="Justify"/>
TimePicker
TimePicker
TimeSelected mendapatkan peristiwa, yang dimunculkan saat waktu yang dipilih berubah. Objek TimeChangedEventArgs yang menyertai TimeSelected
peristiwa memiliki NewTime
properti dan OldTime
, yang masing-masing menentukan waktu baru dan lama.
WebView
WebView
ProcessTerminated
menambahkan peristiwa yang dimunculkan saat WebView proses berakhir secara tak terduga. Objek WebViewProcessTerminatedEventArgs
yang menyertai peristiwa ini mendefinisikan properti khusus platform yang menunjukkan mengapa proses gagal.
Pengikatan yang dikompilasi dalam kode
Pengikatan yang ditulis dalam kode biasanya menggunakan jalur string yang diselesaikan pada runtime dengan pantulan, dan overhead melakukan ini bervariasi dari platform ke platform. .NET MAUI 9 memperkenalkan metode ekstensi tambahan SetBinding yang menentukan pengikatan menggunakan Func
argumen alih-alih jalur string:
// in .NET 8
MyLabel.SetBinding(Label.TextProperty, "Text");
// in .NET 9
MyLabel.SetBinding(Label.TextProperty, static (Entry entry) => entry.Text);
Pendekatan pengikatan yang dikompilasi ini memberikan manfaat berikut:
- Meningkatkan performa pengikatan data dengan menyelesaikan ekspresi pengikatan pada waktu kompilasi daripada runtime.
- Pengalaman pemecahan masalah pengembang yang lebih baik karena pengikatan yang tidak valid dilaporkan sebagai kesalahan build.
- Intellisense saat mengedit.
Tidak semua metode dapat digunakan untuk menentukan pengikatan yang dikompilasi. Ekspresi harus berupa ekspresi akses properti sederhana. Contoh berikut menunjukkan ekspresi pengikatan yang valid dan tidak valid:
// 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}";
Peringatan
Kesalahan pengkompilasi CS0272 akan terjadi jika aksesor yang ditetapkan untuk properti atau pengindeks tidak dapat diakses. Jika ini terjadi, tingkatkan aksesibilitas aksesor.
Selain itu, .NET MAUI 9 menambahkan BindingBase.Create metode yang mengatur pengikatan langsung pada objek dengan Func
, dan mengembalikan instans objek pengikatan:
// 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()
});
Penting
Pengikatan yang dikompilasi diperlukan alih-alih pengikatan berbasis string di aplikasi NativeAOT, dan di aplikasi dengan pemangkasan penuh diaktifkan.
Untuk informasi selengkapnya tentang pengikatan yang dikompilasi dalam kode, lihat Pengikatan terkompilasi dalam kode.
Pengikatan yang dikompilasi di XAML
Di .NET MAUI 8, pengikatan yang dikompilasi dinonaktifkan untuk ekspresi pengikatan XAML apa pun yang menentukan Source
properti, dan tidak didukung pada multi-pengikatan. Pembatasan ini telah dihapus di .NET MAUI 9. Untuk informasi tentang mengkompilasi ekspresi pengikatan XAML yang menentukan Source
properti , lihat Mengkompilasi pengikatan yang menentukan Source
properti .
Secara default, .NET MAUI 9 menghasilkan peringatan build untuk pengikatan yang tidak menggunakan pengikatan yang dikompilasi. Untuk informasi selengkapnya tentang peringatan pengikatan yang dikompilasi XAML, lihat peringatan pengikatan yang dikompilasi XAML.
Injeksi dependensi
Dalam aplikasi Shell, Anda tidak perlu lagi mendaftarkan halaman Anda dengan kontainer injeksi dependensi kecuali Anda ingin memengaruhi masa pakai halaman relatif terhadap kontainer dengan AddSingleton
metode , , AddTransient
atau AddScoped
. Untuk informasi selengkapnya tentang metode ini, lihat Masa pakai dependensi.
Pemutusan handler
Saat menerapkan kontrol kustom menggunakan handler, setiap implementasi handler platform diperlukan untuk mengimplementasikan DisconnectHandler() metode , untuk melakukan pembersihan tampilan asli seperti berhenti berlangganan dari peristiwa. Namun, sebelum .NET MAUI 9, DisconnectHandler() implementasinya sengaja tidak dipanggil oleh .NET MAUI. Sebagai gantinya, Anda harus memanggilnya sendiri saat memilih untuk membersihkan kontrol, seperti saat menavigasi mundur di aplikasi.
Di .NET MAUI 9, handler secara otomatis memutuskan sambungan dari kontrol mereka jika memungkinkan, seperti saat menavigasi mundur di aplikasi. Dalam beberapa skenario, Anda mungkin tidak menginginkan perilaku ini. Oleh karena itu, .NET MAUI 9 menambahkan HandlerProperties.DisconnectPolicy
properti terlampir untuk mengontrol kapan handler terputus dari kontrolnya. Properti ini memerlukan HandlerDisconnectPolicy argumen, dengan enumerasi yang menentukan nilai berikut:
-
Automatic
, yang menunjukkan bahwa handler akan terputus secara otomatis. Ini adalah nilai default propertiHandlerProperties.DisconnectPolicy
terlampir. -
Manual
, yang menunjukkan bahwa handler harus terputus secara manual dengan memanggil DisconnectHandler() implementasi.
Contoh berikut menunjukkan pengaturan HandlerProperties.DisconnectPolicy
properti terlampir:
<controls:Video x:Name="video"
HandlerProperties.DisconnectPolicy="Manual"
Source="video.mp4"
AutoPlay="False" />
Kode C# yang setara adalah:
Video video = new Video
{
Source = "video.mp4",
AutoPlay = false
};
HandlerProperties.SetDisconnectPolicy(video, HandlerDisconnectPolicy.Manual);
Selain itu, ada DisconnectHandlers metode ekstensi yang memutuskan penghandel dari IView:
video.DisconnectHandlers();
Saat memutuskan sambungan, DisconnectHandlers metode akan menyebar ke bawah pohon kontrol sampai selesai atau tiba pada kontrol yang telah menetapkan kebijakan manual.
Dukungan multi-jendela
.NET MAUI 9 menambahkan kemampuan untuk membawa jendela tertentu ke depan di Mac Catalyst dan Windows dengan Application.Current.ActivateWindow
metode :
Application.Current?.ActivateWindow(windowToActivate);
Penyebaran AOT asli
Di .NET MAUI 9 Anda dapat memilih penyebaran AOT Asli di iOS dan Mac Catalyst. Penyebaran AOT asli menghasilkan aplikasi .NET MAUI yang telah dikompilasi ke kode asli. Ini menghasilkan manfaat berikut:
- Ukuran paket aplikasi yang dikurangi, biasanya hingga 2,5x lebih kecil.
- Waktu mulai yang lebih cepat, biasanya hingga 2x lebih cepat.
- Waktu build yang lebih cepat.
Untuk informasi selengkapnya, lihat Penyebaran AOT asli di iOS dan Mac Catalyst.
Penyematan asli
.NET MAUI 9 menyertakan API penuh untuk skenario penyematan asli, yang sebelumnya harus ditambahkan secara manual ke proyek Anda:
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);
Atau, Anda dapat menggunakan metode , ToPlatformEmbedded
meneruskan Window
untuk platform tempat aplikasi berjalan:
var mauiApp = MauiProgram.CreateMauiApp();
var mauiView = new MyMauiContent();
var nativeView = mauiView.ToPlatformEmbedded(mauiApp, window);
Dalam kedua contoh, nativeView
adalah versi khusus platform dari mauiView
.
Untuk melakukan bootstrap aplikasi asli yang disematkan di .NET MAUI 9, panggil UseMauiEmbeddedApp
metode ekstensi pada objek Anda MauiAppBuilder
:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiEmbeddedApp<App>();
return builder.Build();
}
}
Untuk informasi selengkapnya, lihat Penyematan asli.
Template Proyek
Templat proyek Aplikasi .NET MAUI mencakup kemampuan untuk membuat aplikasi todo yang berfungsi penuh, menggunakan kontrol dari Syncfusion Toolkit untuk .NET MAUI untuk memvisualisasikan data dan mempertahankannya ke database lokal berdasarkan SQLite. Untuk membuat aplikasi todo ini, buat proyek baru di Visual Studio menggunakan templat proyek Aplikasi .NET MAUI, lalu centang kotak centang Sertakan konten sampel di jendela Informasi tambahan:
Aplikasi todo juga dapat dibuat dari .NET CLI dengan --sample-content
opsi atau -sc
:
dotnet new maui --sample-content -n MyProject
.NET MAUI 9 juga menambahkan templat proyek .NET MAUI Blazor Hybrid dan Web App ke Visual Studio yang membuat solusi dengan aplikasi .NET MAUI Blazor Hybrid dengan aplikasi Blazor Web, yang berbagi kode umum dalam proyek pustaka kelas Razor.
Templat juga dapat digunakan dari .NET CLI:
dotnet new maui-blazor-web -n MyProject
Kamus sumber daya
Di .NET MAUI 9, XAML ResourceDictionary yang berdiri sendiri (yang tidak didukung oleh file code-behind) default untuk mengkompilasi XAML-nya. Untuk menolak perilaku ini, tentukan <?xaml-comp compile="false" ?>
setelah header XML.
Pemangkasan
Pemangkasan penuh sekarang didukung dengan mengatur $(TrimMode)
properti MSBuild ke full
. Untuk informasi selengkapnya, lihat Memangkas aplikasi MAUI .NET.
Pemangkasan ketidaksesuaian
Fitur MAUI .NET berikut tidak kompatibel dengan pemangkasan penuh dan akan dihapus oleh pemangkas:
- Ekspresi pengikatan tempat jalur pengikatan tersebut diatur ke string. Sebagai gantinya, gunakan pengikatan yang dikompilasi. Untuk informasi selengkapnya, lihat Pengikatan yang dikompilasi.
- Operator konversi implisit, saat menetapkan nilai jenis yang tidak kompatibel ke properti di XAML, atau ketika dua properti dari jenis yang berbeda menggunakan pengikatan data. Sebagai gantinya, Anda harus menentukan TypeConverter untuk jenis Anda dan melampirkannya ke jenis menggunakan TypeConverterAttribute. Untuk informasi selengkapnya, lihat Menentukan TypeConverter untuk menggantikan operator konversi implisit.
- Memuat XAML saat runtime dengan LoadFromXaml metode ekstensi. XAML ini dapat dibuat aman dengan menganotasi semua jenis yang dapat dimuat pada runtime dengan
DynamicallyAccessedMembers
atribut atauDynamicDependency
atribut . Namun, ini sangat rawan kesalahan dan tidak disarankan. - Menerima data navigasi menggunakan QueryPropertyAttribute. Sebagai gantinya IQueryAttributable , Anda harus menerapkan antarmuka pada jenis yang perlu menerima parameter kueri. Untuk informasi selengkapnya, lihat Memproses data navigasi menggunakan satu metode.
-
SearchHandler.DisplayMemberName
Properti. Sebagai gantinya, Anda harus memberikan ItemTemplate untuk menentukan tampilan SearchHandler hasil. Untuk informasi selengkapnya, lihat Menentukan tampilan item hasil pencarian. - Kontrol HybridWebView , karena penggunaan fitur serialisasi dinamis
System.Text.Json
. - Kustomisasi UI dengan ekstensi markup XAML
OnPlatform
. Sebagai gantinya, Anda harus menggunakan kelas OnPlatform<T>. Untuk informasi selengkapnya, lihat Menyesuaikan tampilan UI berdasarkan platform. - Kustomisasi UI dengan ekstensi markup XAML
OnIdiom
. Sebagai gantinya, Anda harus menggunakan kelas OnIdiom<T>. Untuk informasi selengkapnya, lihat Menyesuaikan tampilan UI berdasarkan idiom perangkat.
Pemangkasan sakelar fitur
.NET MAUI memiliki arahan pemangkas, yang dikenal sebagai sakelar fitur, yang memungkinkan untuk mempertahankan kode untuk fitur yang tidak dipangkas dengan aman. Direktif pemangkas ini dapat digunakan ketika $(TrimMode)
properti build diatur ke full
, serta untuk AOT Asli:
Properti MSBuild | Deskripsi |
---|---|
MauiEnableVisualAssemblyScanning |
Ketika diatur ke true , .NET MAUI akan memindai rakitan untuk jenis yang menerapkan IVisual dan untuk [assembly:Visual(...)] atribut, dan akan mendaftarkan jenis ini. Secara default, properti build ini diatur ke false ketika pemangkasan penuh diaktifkan. |
MauiShellSearchResultsRendererDisplayMemberNameSupported |
Ketika diatur ke false , nilai SearchHandler.DisplayMemberName akan diabaikan. Sebagai gantinya, Anda harus memberikan ItemTemplate untuk menentukan tampilan SearchHandler hasil. Secara default, properti build ini diatur ke false saat pemangkasan penuh atau AOT Asli diaktifkan. |
MauiQueryPropertyAttributeSupport |
Saat diatur ke false , [QueryProperty(...)] atribut tidak akan digunakan untuk mengatur nilai properti saat menavigasi. Sebagai gantinya IQueryAttributable , Anda harus menerapkan antarmuka untuk menerima parameter kueri. Secara default, properti build ini diatur ke false saat pemangkasan penuh atau AOT Asli diaktifkan. |
MauiImplicitCastOperatorsUsageViaReflectionSupport |
Saat diatur ke false , .NET MAUI tidak akan mencari operator konversi implisit saat mengonversi nilai dari satu jenis ke jenis lainnya. Ini dapat memengaruhi pengikatan antara properti dengan jenis yang berbeda, dan mengatur nilai properti dari objek yang dapat diikat dengan nilai dari jenis yang berbeda. Sebagai gantinya, Anda harus menentukan TypeConverter untuk jenis Anda dan melampirkannya ke jenis menggunakan TypeConverterAttribute atribut . Secara default, properti build ini diatur ke false saat pemangkasan penuh atau AOT Asli diaktifkan. |
_MauiBindingInterceptorsSupport |
Ketika diatur ke false , .NET MAUI tidak akan mencegat panggilan apa pun ke SetBinding metode dan tidak akan mencoba mengkompilasinya. Secara default, properti build ini diatur ke true . |
MauiEnableXamlCBindingWithSourceCompilation |
Ketika diatur ke true , .NET MAUI akan mengkompilasi semua pengikatan, termasuk tempat Source properti digunakan. Jika Anda mengaktifkan fitur ini, pastikan bahwa semua pengikatan memiliki benar x:DataType sehingga mengkompilasi, atau menghapus jenis data dengan x:Data={x:Null}} jika pengikatan tidak boleh dikompilasi. Secara default, properti build ini diatur ke true saat pemangkasan penuh atau AOT Asli diaktifkan. |
MauiHybridWebViewSupported |
Saat diatur ke false , HybridWebView kontrol tidak akan tersedia. Secara default, properti build ini diatur ke false saat pemangkasan penuh atau AOT Asli diaktifkan. |
Properti MSBuild ini juga memiliki sakelar yang setara AppContext :
- Properti
MauiEnableVisualAssemblyScanning
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.IsIVisualAssemblyScanningEnabled
. - Properti
MauiShellSearchResultsRendererDisplayMemberNameSupported
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.IsShellSearchResultsRendererDisplayMemberNameSupported
. - Properti
MauiQueryPropertyAttributeSupport
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.IsQueryPropertyAttributeSupported
. - Properti
MauiImplicitCastOperatorsUsageViaReflectionSupport
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.IsImplicitCastOperatorsUsageViaReflectionSupported
. - Properti
_MauiBindingInterceptorsSupport
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.AreBindingInterceptorsSupported
. - Properti
MauiEnableXamlCBindingWithSourceCompilation
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.MauiEnableXamlCBindingWithSourceCompilationEnabled
. - Properti
MauiHybridWebViewSupported
MSBuild memiliki sakelar yang setara AppContext bernamaMicrosoft.Maui.RuntimeFeature.IsHybridWebViewSupported
.
Cara term mudah untuk menggunakan sakelar fitur adalah dengan menempatkan properti MSBuild yang sesuai ke dalam file proyek aplikasi Anda (*.csproj), yang menyebabkan kode terkait dipangkas dari rakitan .NET MAUI.
Penyebaran aplikasi Windows
Saat men-debug dan menyebarkan proyek .NET MAUI baru ke Windows, perilaku default di .NET MAUI 9 adalah menyebarkan aplikasi yang tidak dikemas. Untuk informasi selengkapnya, lihat Menyebarkan dan men-debug aplikasi .NET MAUI Anda di Windows.
Kode kesalahan pengkompilasi XAML
Di .NET MAUI 9, kode kesalahan pengkompilasi XAML telah mengubah awalannya dari XFC
menjadi XC
. Pastikan Anda memperbarui $(WarningsAsErrors)
properti build , $(WarningsNotAsErrors)
, dan $(NoWarn)
di file proyek aplikasi Anda, jika digunakan, untuk mereferensikan awalan baru.
Ekstensi markup XAML
Semua kelas yang mengimplementasikan IMarkupExtension, IMarkupExtension<T>, IValueProvider, dan IExtendedTypeConverter perlu diannotasi dengan RequireServiceAttribute atau AcceptEmptyServiceProviderAttribute. Ini diperlukan karena pengoptimalan kompilator XAML yang diperkenalkan di .NET MAUI 9 yang memungkinkan pembuatan kode yang lebih efisien, yang membantu mengurangi ukuran aplikasi dan meningkatkan performa runtime.
Untuk informasi tentang menganotasi ekstensi markup dengan atribut ini, lihat Penyedia layanan.
Sinkronisasi Xcode
.NET MAUI 9 mencakup sinkronisasi Xcode (xcsync
), yang merupakan alat yang memungkinkan Anda menggunakan Xcode untuk mengelola file spesifik Apple dengan proyek .NET, termasuk katalog aset, file plist, papan cerita, dan file xib. Alat ini memiliki dua perintah utama untuk menghasilkan proyek Xcode sementara dari proyek .NET, dan untuk menyinkronkan perubahan dari file Xcode kembali ke proyek .NET Anda.
Penting
xcsync saat ini dalam pratinjau.
Anda menggunakan dotnet build
dengan xcsync-generate
perintah atau xcsync-sync
, untuk membuat atau menyinkronkan file-file ini, dan meneruskan file proyek dan argumen tambahan:
dotnet build /t:xcsync-generate
/p:xcSyncProjectFile=<PROJECT>
/p:xcSyncXcodeFolder=<TARGET_XCODE_DIRECTORY>
/p:xcSyncTargetFrameworkMoniker=<FRAMEWORK>
/p:xcSyncVerbosity=<LEVEL>
Untuk informasi selengkapnya, lihat Sinkronisasi Xcode.
API yang tidak digunakan lagi
.NET MAUI 9 menghentikan beberapa API, yang akan dihapus sepenuhnya dalam rilis mendatang.
Menengah
Kontrol Frame ditandai sebagai usang di .NET MAUI 9, dan akan dihapus sepenuhnya dalam rilis mendatang. Border Kontrol harus digunakan di tempatnya.
Saat mengganti Frame dengan Border, nilai properti Frame.BorderColor harus menjadi nilai properti Border.Stroke, dan nilai properti Frame.CornerRadius harus menjadi bagian dari nilai properti Border.StrokeShape. Selain itu, mungkin perlu untuk menduplikasi nilai Margin
sebagai nilai Padding
.
Contoh berikut menunjukkan elemen Frame dan Border yang setara di XAML:
<Frame BorderColor="DarkGray"
CornerRadius="5"
Margin="20"
HeightRequest="360"
HorizontalOptions="Center"
VerticalOptions="Center" />
<Border Stroke="DarkGray"
StrokeShape="RoundRectangle 5"
Margin="20"
Padding="20"
HeightRequest="360"
HorizontalOptions="Center"
VerticalOptions="Center" />
Untuk informasi selengkapnya, lihat Batas.
MainPage
Alih-alih menentukan halaman pertama aplikasi Anda menggunakan MainPage properti pada Application objek, Anda harus mengatur Page properti pada Window halaman pertama aplikasi Anda. Inilah yang terjadi secara internal di .NET MAUI saat Anda mengatur MainPage properti, sehingga tidak ada perubahan perilaku yang diperkenalkan oleh MainPage properti yang ditandai sebagai usang.
Contoh berikut menunjukkan pengaturan Page properti pada Window, melalui penimpaan CreateWindow
:
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}
Kode yang mengakses Application.Current.MainPage
properti sekarang harus mengakses Application.Current.Windows[0].Page
properti untuk aplikasi dengan satu jendela. Untuk aplikasi dengan beberapa jendela, gunakan Application.Current.Windows
koleksi untuk mengidentifikasi jendela yang benar lalu akses Page
properti . Selain itu, setiap elemen memiliki Window
properti, yang dapat diakses ketika elemen adalah bagian dari jendela saat ini, tempat Page
properti dapat diakses (Window.Page
). Kode platform dapat mengambil objek aplikasi IWindow dengan Microsoft.Maui.Platform.GetWindow
metode ekstensi.
MainPage Sementara properti dipertahankan di .NET MAUI 9, properti akan dihapus sepenuhnya dalam rilis mendatang.
Tata letak kompatibilitas
Kelas tata letak kompatibilitas di Microsoft.Maui.Controls.Compatibility namespace telah usang.
Panggilan pengukuran warisan
Metode pengukuran berikut VisualElement telah usang:
Ini adalah metode pengukuran warisan yang tidak berfungsi dengan benar dengan ekspektasi tata letak .NET MAUI.
Sebagai pengganti, VisualElement.Measure(Double, Double) metode telah diperkenalkan. Metode ini mengembalikan ukuran minimum yang dibutuhkan elemen untuk ditampilkan pada perangkat. Margin dikecualikan dari pengukuran, tetapi dikembalikan dengan ukurannya. Ini adalah metode yang disukai untuk dipanggil saat mengukur tampilan.
Selain itu, SizeRequest struktur usang. Sebagai gantinya, Size harus digunakan.
Tingkatkan dari .NET 8 ke .NET 9
Untuk meningkatkan proyek .NET MAUI Anda dari .NET 8 ke .NET 9, pertama-tama instal .NET 9 dan beban kerja .NET MAUI dengan Visual Studio 17.12+, atau dengan Visual Studio Code dan ekstensi .NET MAUI dan .NET dan beban kerja .NET MAUI, atau dengan alat penginstal mandiri dan dotnet workload install maui
perintah .
Memperbarui file proyek
Untuk memperbarui aplikasi .NET MAUI Anda dari .NET 8 ke .NET 9, buka file proyek aplikasi (.csproj) dan ubah Monikers Kerangka Kerja Target (TFM) dari 8 menjadi 9. Jika Anda menggunakan TFM seperti net8.0-ios15.2
pastikan untuk mencocokkan versi platform atau menghapusnya sepenuhnya. Contoh berikut menunjukkan TFM untuk proyek .NET 8:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
Contoh berikut menunjukkan TFM untuk proyek .NET 9:
<TargetFrameworks>net9.0-android;net9.0-ios;net9.0-maccatalyst;net9.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net9.0-windows10.0.19041.0</TargetFrameworks>
Jika file proyek aplikasi Anda mereferensikan versi .NET 8 dari Microsoft.Maui.Controls
paket NuGet, baik secara langsung atau melalui $(MauiVersion)
properti build, perbarui ini ke versi .NET 9. Kemudian, hapus referensi paket untuk Microsoft.Maui.Controls.Compatibility
paket NuGet, asalkan aplikasi Anda tidak menggunakan jenis apa pun dari paket ini. Selain itu, perbarui referensi paket untuk Microsoft.Extensions.Logging.Debug
paket NuGet ke rilis .NET 9 terbaru.
Jika aplikasi Anda menargetkan iOS atau Mac Catalyst, perbarui $(SupportedOSPlatformVersion)
properti build untuk platform ini menjadi 15.0:
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">15.0</SupportedOSPlatformVersion>
Saat men-debug dan menyebarkan proyek .NET MAUI baru ke Windows, perilaku default di .NET 9 adalah menyebarkan aplikasi yang tidak dipaketkan. Untuk mengadopsi perilaku ini, lihat Mengonversi aplikasi Windows .NET MAUI yang dikemas untuk dibongkar.
Sebelum membuat aplikasi yang ditingkatkan untuk pertama kalinya, hapus bin
folder dan obj
. Setiap kesalahan build dan peringatan akan memandu Anda menuju langkah berikutnya.
Memperbarui kode kesalahan pengkompilasi XAML
Kode kesalahan pengkompilasi XAML telah mengubah awalannya dari XFC
menjadi XC
, jadi perbarui $(WarningsAsErrors)
properti build , , $(WarningsNotAsErrors)
dan $(NoWarn)
di file proyek aplikasi Anda, jika digunakan, untuk mereferensikan awalan baru.
Mengatasi peringatan kompilator XAML baru untuk pengikatan yang dikompilasi
Peringatan build akan dihasilkan untuk pengikatan yang tidak menggunakan pengikatan yang dikompilasi, dan ini perlu ditangani. Untuk informasi selengkapnya, lihat Peringatan pengikatan yang dikompilasi XAML.
Memperbarui ekstensi markup XAML
Ekstensi markup XAML perlu diannotasi dengan RequireServiceAttribute atau AcceptEmptyServiceProviderAttribute. Ini diperlukan karena pengoptimalan kompilator XAML yang memungkinkan pembuatan kode yang lebih efisien, yang membantu mengurangi ukuran aplikasi dan meningkatkan performa runtime. Untuk informasi selengkapnya, lihat Penyedia layanan.
Alamat API yang tidak digunakan lagi
.NET MAUI 9 menghentikan beberapa API, yang akan dihapus sepenuhnya dalam rilis mendatang. Oleh karena itu, atasi peringatan build apa pun tentang API yang tidak digunakan lagi. Untuk informasi selengkapnya, lihat API yang tidak digunakan lagi.
Mengadopsi pengikatan terkompilasi yang mengatur properti Sumber
Anda dapat memilih untuk mengkompilasi pengikatan yang mengatur Source
properti, untuk memanfaatkan performa runtime yang lebih baik. Untuk informasi selengkapnya, lihat Mengkompilasi pengikatan yang menentukan Source
properti .
Mengadopsi pengikatan yang dikompilasi di C#
Anda dapat memilih untuk mengkompilasi ekspresi pengikatan yang dideklarasikan dalam kode, untuk memanfaatkan performa runtime yang lebih baik. Untuk informasi selengkapnya, lihat Pengikatan terkompilasi dalam kode.
Mengadopsi pemangkasan penuh
Anda dapat mengadopsi menggunakan pemangkasan penuh, untuk mengurangi ukuran keseluruhan aplikasi Anda, dengan mengatur $(TrimMode)
properti MSBuild ke full
. Untuk informasi selengkapnya, lihat Memangkas aplikasi MAUI .NET.
Mengadopsi penyebaran NativeAOT pada platform yang didukung
Anda dapat memilih penyebaran AOT Asli di iOS dan Mac Catalyst. Penyebaran AOT asli menghasilkan aplikasi .NET MAUI yang telah dikompilasi ke kode asli. Untuk informasi selengkapnya, lihat Penyebaran AOT asli di iOS dan Mac Catalyst.
.NET untuk Android
.NET untuk Android di .NET 9, yang menambahkan dukungan untuk API 35, mencakup pekerjaan untuk mengurangi waktu build, dan untuk meningkatkan trimability aplikasi untuk mengurangi ukuran dan meningkatkan performa. Untuk informasi selengkapnya tentang .NET untuk Android di .NET 9, lihat catatan rilis berikut:
- .NET untuk Android 9
- .NET untuk Android 9 RC2
- .NET untuk Android 9 RC1
- .NET untuk Pratinjau Android 9 7
- .NET untuk Pratinjau Android 9 6
- .NET untuk Pratinjau Android 9 5
- .NET untuk Pratinjau Android 9 4
- .NET untuk Pratinjau Android 9 3
- .NET untuk Pratinjau Android 9 2
- .NET untuk Pratinjau Android 9 1
Paket aset
.NET untuk Android di .NET 9 memperkenalkan kemampuan untuk menempatkan aset ke dalam paket terpisah, yang dikenal sebagai paket aset. Ini memungkinkan Anda untuk mengunggah game dan aplikasi yang biasanya lebih besar dari ukuran paket dasar yang diizinkan oleh Google Play. Dengan memasukkan aset ini ke dalam paket terpisah, Anda mendapatkan kemampuan untuk mengunggah paket yang berukuran hingga 2Gb, daripada ukuran paket dasar 200Mb.
Penting
Paket aset hanya dapat berisi aset. Dalam kasus .NET untuk Android, ini berarti item yang memiliki AndroidAsset
tindakan build.
Aplikasi MAUI .NET menentukan aset melalui MauiAsset
tindakan build. Paket aset dapat ditentukan melalui AssetPack
atribut :
<MauiAsset
Include="Resources\Raw\**"
LogicalName="%(RecursiveDir)%(Filename)%(Extension)"
AssetPack="myassetpack" />
Catatan
Metadata tambahan akan diabaikan oleh platform lain.
Jika Anda memiliki item tertentu yang ingin Anda tempatkan dalam paket aset, Anda dapat menggunakan Update
atribut untuk menentukan AssetPack
metadata:
<MauiAsset Update="Resources\Raw\MyLargeAsset.txt" AssetPack="myassetpack" />
Paket aset dapat memiliki opsi pengiriman yang berbeda, yang mengontrol kapan aset Anda akan diinstal pada perangkat:
- Paket waktu penginstalan diinstal pada saat yang sama dengan aplikasi. Jenis paket ini bisa berukuran hingga 1Gb, tetapi Anda hanya dapat memiliki salah satunya. Jenis pengiriman ini ditentukan dengan
InstallTime
metadata. - Paket ikuti cepat akan diinstal pada beberapa titik segera setelah aplikasi selesai diinstal. Aplikasi akan dapat dimulai saat jenis paket ini sedang diinstal sehingga Anda harus memeriksanya telah selesai diinstal sebelum mencoba menggunakan aset. Paket aset semacam ini dapat berukuran hingga 512Mb. Jenis pengiriman ini ditentukan dengan
FastFollow
metadata. - Paket sesuai permintaan tidak akan pernah diunduh ke perangkat kecuali aplikasi secara khusus memintanya. Ukuran total semua paket aset Anda tidak boleh melebihi 2Gb, dan Anda dapat memiliki hingga 50 paket aset terpisah. Jenis pengiriman ini ditentukan dengan
OnDemand
metadata.
Di aplikasi .NET MAUI, jenis pengiriman dapat ditentukan dengan DeliveryType
atribut pada MauiAsset
:
<MauiAsset Update="Resources\Raw\myvideo.mp4" AssetPack="myassetpack" DeliveryType="FastFollow" />
Untuk informasi selengkapnya tentang paket aset Android, lihat Paket aset Android.
Dukungan Android 15
.NET untuk Android di .NET 9 menambahkan pengikatan .NET untuk Android 15 (API 35). Untuk membangun API ini, perbarui kerangka kerja target proyek Anda ke net9.0-android
:
<TargetFramework>net9.0-android</TargetFramework>
Catatan
Anda juga dapat menentukan net9.0-android35
sebagai kerangka kerja target, tetapi angka 35 mungkin akan berubah dalam rilis .NET di masa mendatang agar sesuai dengan rilis OS Android yang lebih baru.
Arsitektur 64-bit secara default
.NET untuk Android di .NET 9 tidak lagi membangun pengidentifikasi runtime (RID) berikut secara default:
android-arm
android-x86
Ini harus meningkatkan waktu build dan mengurangi ukuran file Android .apk
. Perhatikan bahwa Google Play mendukung pemisahan bundel aplikasi per arsitektur.
Jika Perlu membangun arsitektur ini, Anda dapat menambahkannya ke file proyek Anda (.csproj):
<RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
Atau dalam proyek multi-target:
<RuntimeIdentifiers Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
Metode marshal Android
Peningkatan metode marshal Android di .NET 9 telah membuat fitur ini berfungsi lebih andal dalam aplikasi tetapi belum menjadi default. Mengaktifkan fitur ini telah menghasilkan peningkatan ~10% dalam performa dalam aplikasi pengujian.
Metode marshal Android dapat diaktifkan dalam file proyek Anda (.csproj) melalui $(AndroidEnableMarshalMethods)
properti :
<PropertyGroup>
<AndroidEnableMarshalMethods>true</AndroidEnableMarshalMethods>
</PropertyGroup>
Untuk detail spesifik tentang fitur ini, lihat dokumentasi atau implementasi fitur di GitHub.
Peningkatan pemangkasan
Di .NET 9, rakitan Android API (Mono.Android.dll, Java.Interop.dll) sekarang sepenuhnya kompatibel dengan trim. Untuk memilih pemangkasan penuh, atur $(TrimMode)
properti dalam file proyek Anda (.csproj):
<PropertyGroup>
<TrimMode>Full</TrimMode>
</PropertyGroup>
Ini juga memungkinkan pemangkasan penganalisis, sehingga peringatan diperkenalkan untuk kode C# yang bermasalah.
Untuk informasi selengkapnya, lihat Memangkas granularitas.
.NET untuk iOS
.NET 9 di iOS, tvOS, Mac Catalyst, dan macOS menggunakan Xcode 16.0 untuk versi platform berikut:
- iOS: 18.0
- tvOS: 18.0
- Mac Catalyst: 18.0
- macOS: 15.0
Untuk informasi selengkapnya tentang .NET 9 di iOS, tvOS, Mac Catalyst, dan macOS, lihat catatan rilis berikut:
- .NET 9
- .NET 9.0.1xx RC2
- .NET 9.0.1xx RC1
- Pratinjau .NET 9.0.1xx 7
- Pratinjau .NET 9.0.1xx 6
- Pratinjau .NET 9.0.1xx 5
- Pratinjau .NET 9.0.1xx 4
- Pratinjau .NET 9.0.1xx 3
- Pratinjau .NET 9.0.1xx 2
- Pratinjau .NET 9.0.1xx 1
Pengikatan
.NET untuk iOS 9 memperkenalkan kemampuan untuk versi multi-target .NET untuk pengikatan iOS. Misalnya, proyek pustaka mungkin perlu dibuat untuk dua versi iOS yang berbeda:
<TargetFrameworks>net9.0-ios17.0;net9.0-ios17.2</TargetFrameworks>
Ini akan menghasilkan dua pustaka, satu menggunakan pengikatan iOS 17.0, dan satu menggunakan pengikatan iOS 17.2.
Penting
Proyek aplikasi harus selalu menargetkan iOS SDK terbaru.
Peningkatan pemangkasan
Di .NET 9, rakitan iOS dan Mac Catalyst (Microsoft.iOS.dll, Microsoft.MacCatalyst.dll dll.) sekarang sepenuhnya kompatibel dengan trim. Untuk memilih pemangkasan penuh, atur $(TrimMode)
properti dalam file proyek Anda (.csproj):
<PropertyGroup>
<TrimMode>Full</TrimMode>
</PropertyGroup>
Ini juga memungkinkan pemangkasan penganalisis, sehingga peringatan diperkenalkan untuk kode C# yang bermasalah.
Untuk informasi selengkapnya, lihat Memangkas granularitas.
AOT Asli untuk iOS & Mac Catalyst
Di .NET untuk iOS 9, kompilasi Ahead of Time (AOT) asli untuk iOS dan Mac Catalyst memanfaatkan pemangkasan penuh untuk mengurangi ukuran paket aplikasi dan performa startup Anda. NativeAOT dibangun setelah pemangkasan penuh, dengan juga memilih ke runtime baru.
Penting
Aplikasi Anda dan dependensinya harus sepenuhnya dapat dipangkas untuk menggunakan fitur ini.
NativeAOT mengharuskan aplikasi dibangun dengan peringatan pemangkas nol, untuk membuktikan aplikasi akan bekerja dengan benar pada runtime.