Menautkan aplikasi .NET MAUI Mac Catalyst
Saat membangun aplikasi Anda, .NET Multi-platform App UI (.NET MAUI) dapat menggunakan linker yang disebut ILLink untuk mengurangi ukuran aplikasi secara keseluruhan. ILLink mengurangi ukuran dengan menganalisis kode perantara yang dihasilkan oleh kompilator. Ini menghapus metode, properti, bidang, peristiwa, struktur, dan kelas yang tidak digunakan untuk menghasilkan aplikasi yang hanya berisi dependensi kode dan perakitan yang diperlukan untuk menjalankan aplikasi.
Perilaku linker
Linker mendukung tiga mode untuk aplikasi .NET MAUI di iOS dan Mac Catalyst:
- Jangan tautkan. Menonaktifkan penautan memastikan rakitan tidak dimodifikasi.
- Tautkan rakitan SDK saja. Dalam mode ini, linker membiarkan rakitan Anda tidak tersentuh dan mengurangi ukuran rakitan SDK dengan menghapus jenis dan anggota yang tidak digunakan aplikasi Anda.
- Tautkan semua rakitan. Saat menautkan semua rakitan, linker melakukan pengoptimalan tambahan untuk membuat aplikasi Anda sesedikit mungkin. Ini memodifikasi kode perantara untuk kode sumber Anda, yang dapat merusak aplikasi Anda jika Anda menggunakan fitur menggunakan pendekatan yang tidak dapat dideteksi oleh analisis statis linker. Dalam kasus ini, Anda mungkin perlu membuat penyesuaian pada kode sumber Anda untuk membuat aplikasi Anda berfungsi dengan benar.
Perilaku linker dapat dikonfigurasi untuk setiap konfigurasi build aplikasi Anda.
Peringatan
Mengaktifkan linker untuk konfigurasi debug aplikasi Anda dapat menghambat pengalaman penelusuran kesalahan Anda, karena dapat menghapus aksesor properti yang memungkinkan Anda memeriksa status objek Anda.
Catatan
Visual Studio untuk Mac dijadwalkan untuk dihentikan pada 31 Agustus 2024 sesuai dengan Kebijakan Siklus Hidup Modern Microsoft. Visual Studio untuk Mac 17.6 akan terus didukung hingga 31 Agustus 2024, dengan pembaruan layanan untuk masalah keamanan dan platform yang diperbarui dari Apple. Untuk informasi selengkapnya, termasuk opsi alternatif untuk mengembangkan di Mac, lihat Apa yang terjadi pada Visual Studio untuk Mac?.
Untuk mengonfigurasi perilaku linker di Visual Studio untuk Mac:
Di Jendela Solusi, klik kanan proyek aplikasi .NET MAUI Anda dan pilih Properti.
Di jendela Properti Proyek, pilih tab Build > Mac Catalyst > Build .
Di jendela Properti Proyek, pastikan menu drop-down Konfigurasi diatur ke Rilis dan atur menu drop-down Perilaku linker ke perilaku linker yang Anda inginkan:
Di jendela Properti Proyek, klik tombol OK .
Mempertahankan kode
Saat Anda menggunakan linker, kadang-kadang menghapus kode yang mungkin telah Anda panggil secara dinamis, bahkan secara tidak langsung. Anda dapat menginstruksikan linker untuk mempertahankan anggota dengan membuat anotasi dengan DynamicDependency
atribut . Atribut ini dapat digunakan untuk mengekspresikan dependensi pada jenis dan subset anggota, atau pada anggota tertentu.
Penting
Setiap anggota di BCL yang tidak dapat ditentukan secara statis untuk digunakan oleh aplikasi akan dihapus.
Atribut DynamicDependency
dapat diterapkan ke konstruktor, bidang, dan metode:
[DynamicDependency("Helper", "MyType", "MyAssembly")]
static void RunHelper()
{
var helper = Assembly.Load("MyAssembly").GetType("MyType").GetMethod("Helper");
helper.Invoke(null, null);
}
Dalam contoh ini, DynamicDependency
memastikan bahwa Helper
metode disimpan. Tanpa atribut , penautan akan menghapus Helper
dari MyAssembly
atau menghapus MyAssembly
sepenuhnya jika tidak dirujuk di tempat lain.
Atribut menentukan anggota untuk disimpan melalui string
atau melalui DynamicallyAccessedMembers
atribut . Jenis dan assembly adalah implisit dalam konteks atribut, atau secara eksplisit ditentukan dalam atribut (menurut Type
, atau dengan string
s untuk jenis dan nama rakitan).
String jenis dan anggota menggunakan variasi format string ID komentar dokumentasi C#, tanpa awalan anggota. String anggota tidak boleh menyertakan nama jenis deklarasikan, dan dapat menghilangkan parameter untuk mempertahankan semua anggota dari nama yang ditentukan. Contoh berikut menunjukkan penggunaan yang valid:
[DynamicDependency("Method()")]
[DynamicDependency("Method(System,Boolean,System.String)")]
[DynamicDependency("MethodOnDifferentType()", typeof(ContainingType))]
[DynamicDependency("MemberName")]
[DynamicDependency("MemberOnUnreferencedAssembly", "ContainingType", "UnreferencedAssembly")]
[DynamicDependency("MemberName", "Namespace.ContainingType.NestedType", "Assembly")]
// generics
[DynamicDependency("GenericMethodName``1")]
[DynamicDependency("GenericMethod``2(``0,``1)")]
[DynamicDependency("MethodWithGenericParameterTypes(System.Collections.Generic.List{System.String})")]
[DynamicDependency("MethodOnGenericType(`0)", "GenericType`1", "UnreferencedAssembly")]
[DynamicDependency("MethodOnGenericType(`0)", typeof(GenericType<>))]
Pertahankan rakitan
Dimungkinkan untuk menentukan rakitan yang harus dikecualikan dari proses penautan, sambil memungkinkan rakitan lain ditautkan. Pendekatan ini dapat berguna ketika Anda tidak dapat dengan mudah menggunakan DynamicDependency
atribut , atau tidak mengontrol kode yang sedang ditautkan.
Saat menautkan semua rakitan, Anda dapat memberi tahu linker untuk melewati perakitan dengan mengatur TrimmerRootAssembly
properti MSBuild dalam <ItemGroup>
tag dalam file proyek:
<ItemGroup>
<TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>
Catatan
.dll
Ekstensi tidak diperlukan saat mengatur TrimmerRootAssembly
properti MSBuild.
Jika linker melewati assembly, itu dianggap berakar, yang berarti bahwa itu dan semua dependensi yang dipahami secara statis disimpan. Anda dapat melewati rakitan tambahan dengan menambahkan lebih banyak TrimmerRootAssembly
properti MSBuild ke <ItemGroup>
.
Mempertahankan rakitan, jenis, dan anggota
Anda dapat meneruskan file deskripsi XML linker yang menentukan rakitan, jenis, dan anggota mana yang perlu dipertahankan.
Untuk mengecualikan anggota dari proses penautan saat menautkan semua rakitan, atur TrimmerRootDescriptor
properti MSBuild dalam <ItemGroup>
tag dalam file proyek ke file XML yang menentukan anggota untuk dikecualikan:
<ItemGroup>
<TrimmerRootDescriptor Include="MyRoots.xml" />
</ItemGroup>
File XML kemudian menggunakan format deskriptor pemangkas untuk menentukan anggota mana yang akan dikecualikan dari penautan:
<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyClass">
<method name="DynamicallyAccessedMethod" />
</type>
</assembly>
</linker>
Dalam contoh ini, file XML menentukan metode yang diakses secara dinamis oleh aplikasi, yang dikecualikan dari penautan.
Ketika rakitan, jenis, atau anggota tercantum dalam XML, tindakan default adalah pelestarian, yang berarti bahwa terlepas dari apakah linker berpikir itu digunakan atau tidak, itu dipertahankan dalam output.
Catatan
Tag pelestarian secara ambigu inklusif. Jika Anda tidak memberikan tingkat detail berikutnya, itu akan mencakup semua anak. Jika rakitan tercantum tanpa jenis apa pun, maka semua jenis dan anggota assembly akan dipertahankan.
Menandai assembly sebagai aman linker
Jika Anda memiliki pustaka di proyek Anda, atau Anda adalah pengembang pustaka yang dapat digunakan kembali dan Anda ingin linker memperlakukan rakitan Anda sebagai dapat ditautkan, Anda dapat menandai perakitan sebagai pengtaut dengan aman dengan menambahkan IsTrimmable
properti MSBuild ke file proyek untuk rakitan:
<PropertyGroup>
<IsTrimmable>true</IsTrimmable>
</PropertyGroup>
Ini menandai rakitan Anda sebagai "dapat dipangkas" dan memungkinkan peringatan pemangkasan untuk proyek tersebut. Menjadi "dapat dipangkas" berarti rakitan Anda dianggap kompatibel dengan pemangkasan dan seharusnya tidak memiliki peringatan pemangkasan saat rakitan dibangun. Saat digunakan dalam aplikasi yang dipangkas, anggota assembly yang tidak digunakan akan dihapus dalam output akhir.
IsTrimmable
Mengatur properti MSBuild ke true
dalam file proyek Anda menyisipkan AssemblyMetadata
atribut ke dalam rakitan Anda:
[assembly: AssemblyMetadata("IsTrimmable", "True")]
Atau, Anda dapat menambahkan AssemblyMetadata
atribut ke assembly Anda tanpa menambahkan IsTrimmable
properti MSBuild ke file proyek untuk assembly Anda.
Catatan
IsTrimmable
Jika properti MSBuild diatur untuk rakitan, ini akan mengambil alih AssemblyMetadata("IsTrimmable", "True")
atribut. Ini memungkinkan Anda untuk memilih assembly ke dalam pemangkasan meskipun tidak memiliki atribut , atau untuk menonaktifkan pemangkasan rakitan yang memiliki atribut .
Menyembunyikan peringatan analisis
Ketika linker diaktifkan, itu menghapus IL yang tidak dapat dijangkau secara statis. Aplikasi yang menggunakan pantulan atau pola lain yang membuat dependensi dinamis dapat rusak sebagai akibatnya. Untuk memperingatkan tentang pola tersebut SuppressTrimAnalysisWarnings
, saat menandai perakitan sebagai penghubung aman, penulis pustaka harus mengatur properti MSBuild ke false
:
<PropertyGroup>
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
</PropertyGroup>
Tidak menekan peringatan analisis pemangkasan akan mencakup peringatan tentang seluruh aplikasi, termasuk kode, kode pustaka, dan kode SDK Anda sendiri.
Tampilkan peringatan terperinci
Analisis pemangkasan menghasilkan paling banyak satu peringatan untuk setiap rakitan yang berasal dari PackageReference
, yang menunjukkan bahwa internal rakitan tidak kompatibel dengan pemangkasan. Sebagai penulis pustaka, ketika Anda menandai rakitan sebagai penghubung aman, Anda harus mengaktifkan peringatan individual untuk semua rakitan dengan mengatur TrimmerSingleWarn
properti MSBuild ke false
:
<PropertyGroup>
<TrimmerSingleWarn>false</TrimmerSingleWarn>
</PropertyGroup>
Pengaturan ini menunjukkan semua peringatan terperinci, alih-alih menciutkannya ke satu peringatan per perakitan.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk