Opsi pemangkasan
Properti dan item MSBuild berikut memengaruhi perilaku penyebaran mandiri yang dipangkas. Beberapa opsi menyebutkan ILLink
, yang merupakan nama alat yang mendasar yang mengimplementasikan pemangkasan. Untuk informasi selengkapnya tentang alat yang mendasar, lihat dokumentasi Pemangkas.
Pemangkasan dengan PublishTrimmed
diperkenalkan dalam .NET Core 3.0. Opsi lain hanya tersedia dalam .NET 5 dan versi yang lebih baru.
Mengaktifkan pemangkasan
<PublishTrimmed>true</PublishTrimmed>
Aktifkan pemangkasan selama penerbitan. Pengaturan ini juga menonaktifkan fitur yang tidak kompatibel dengan trim dan memungkinkan analisis pemangkasan selama build. Di aplikasi .NET 8 dan yang lebih baru, pengaturan ini juga memungkinkan pengikatan konfigurasi dan meminta generator sumber delegasi.
Catatan
Jika Anda menentukan pemangkasan sebagai diaktifkan dari baris perintah, pengalaman penelusuran kesalahan Anda akan berbeda dan Anda mungkin mengalami bug tambahan di produk akhir.
Tempatkan pengaturan ini dalam file proyek untuk memastikan bahwa pengaturan berlaku selama dotnet build
, bukan hanya dotnet publish
.
Pengaturan ini memungkinkan pemangkasan dan pemangkasan semua rakitan secara default. Di .NET 6, hanya rakitan yang memilih untuk memangkas melalui [AssemblyMetadata("IsTrimmable", "True")]
dipangkas secara default. Anda dapat kembali ke perilaku sebelumnya dengan menggunakan <TrimMode>partial</TrimMode>
.
Pengaturan ini memangkas rakitan apa pun yang telah dikonfigurasi untuk pemangkasan. Dengan Microsoft.NET.Sdk
dalam .NET 6, ini mencakup rakitan apa pun dengan [AssemblyMetadata("IsTrimmable", "True")]
, yang merupakan kasus untuk rakitan runtime .NET. Di .NET 5, rakitan dari paket runtime netcoreapp dikonfigurasi untuk pemangkasan melalui <IsTrimmable>
metadata MSBuild. SDK lain mungkin menentukan default yang berbeda.
Pengaturan ini juga memungkinkan penganalisis Roslyn kompatibilitas pemangkasan dan menonaktifkan fitur yang tidak kompatibel dengan pemangkasan.
Pemangkasan granularitas
TrimMode
Gunakan properti untuk mengatur granularitas pemangkasan ke atau partial
full
. Pengaturan default untuk aplikasi konsol (dan, mulai dari .NET 8, aplikasi Web SDK) adalah full
:
<TrimMode>full</TrimMode>
Untuk hanya memangkas rakitan yang telah memilih untuk memangkas, atur properti ke partial
:
<TrimMode>partial</TrimMode>
Jika Anda mengubah mode pemangkasan menjadi partial
, Anda dapat memilih rakitan individual untuk memangkas dengan menggunakan <TrimmableAssembly>
item MSBuild.
<ItemGroup>
<TrimmableAssembly Include="MyAssembly" />
</ItemGroup>
Ini setara dengan pengaturan [AssemblyMetadata("IsTrimmable", "True")]
saat membangun perakitan.
Pengaturan granularitas berikut mengontrol bagaimana IL yang tidak digunakan secara agresif dibuang. Ini dapat diatur sebagai properti yang memengaruhi semua rakitan input pemangkas, atau sebagai metadata pada rakitan individual, yang mengambil alih pengaturan properti.
<TrimMode>link</TrimMode>
Aktifkan pemangkasan tingkat anggota, yang menghapus anggota yang tidak digunakan dari jenis. Ini adalah default dalam .NET 6+.
<TrimMode>copyused</TrimMode>
Aktifkan pemangkasan tingkat perakitan, yang menyimpan seluruh rakitan jika ada bagian darinya yang digunakan (dengan cara yang dipahami secara statis).
Rakitan dengan <IsTrimmable>true</IsTrimmable>
metadata tetapi tidak ada eksplisit TrimMode
yang akan menggunakan global TrimMode
. Default TrimMode
untuk Microsoft.NET.Sdk
berada link
di .NET 6+, dan copyused
di versi sebelumnya.
Memangkas rakitan tambahan
Di .NET 6+, PublishTrimmed
pangkas rakitan dengan atribut tingkat rakitan berikut:
[AssemblyMetadata("IsTrimmable", "True")]
Pustaka kerangka kerja memiliki atribut ini. Di .NET 6+, Anda juga dapat memilih untuk memangkas pustaka tanpa atribut ini, menentukan rakitan berdasarkan nama (tanpa .dll
ekstensi).
Pemangkasan pengaturan untuk rakitan individual
Saat menerbitkan aplikasi yang dipangkas, SDK menghitung panggilan ItemGroup
ManagedAssemblyToLink
yang mewakili kumpulan file yang akan diproses untuk pemangkasan. ManagedAssemblyToLink
mungkin memiliki metadata yang mengontrol perilaku pemangkasan per perakitan. Untuk mengatur metadata ini, buat target yang berjalan sebelum target bawaan PrepareForILLink
. Contoh berikut menunjukkan cara mengaktifkan pemangkasan MyAssembly
.
<Target Name="ConfigureTrimming"
BeforeTargets="PrepareForILLink">
<ItemGroup>
<ManagedAssemblyToLink Condition="'%(Filename)' == 'MyAssembly'">
<IsTrimmable>true</IsTrimmable>
</ManagedAssemblyToLink>
</ItemGroup>
</Target>
Anda juga dapat menggunakan target ini untuk mengambil alih perilaku pemangkasan yang ditentukan oleh penulis pustaka, dengan mengatur <IsTrimmable>false</IsTrimmable>
untuk perakitan dengan [AssemblyMetadata("IsTrimmable", "True"])
.
Jangan menambahkan atau menghapus item dari ManagedAssemblyToLink
, karena SDK menghitung set ini selama penerbitan dan mengharapkannya tidak berubah. Metadata yang didukung adalah:
<IsTrimmable>true</IsTrimmable>
Mengontrol apakah rakitan yang diberikan dipangkas.
<TrimMode>copyused</TrimMode>
atau<TrimMode>link</TrimMode>
Mengontrol granularitas pemangkasan rakitan ini. Metadata ini lebih diutamakan daripada global
TrimMode
. PengaturanTrimMode
pada rakitan menyiratkan<IsTrimmable>true</IsTrimmable>
.<TrimmerSingleWarn>True</TrimmerSingleWarn>
Kontrol apakah akan menampilkan peringatan tunggal untuk rakitan ini.
Rakitan akar
Jika rakitan tidak dipangkas, itu dianggap "berakar", yang berarti bahwa itu dan semua dependensi yang dipahami secara statis akan disimpan. Rakitan tambahan dapat "di-root" berdasarkan nama (tanpa .dll
ekstensi):
<ItemGroup>
<TrimmerRootAssembly Include="MyAssembly" />
</ItemGroup>
Deskriptor akar
Cara lain untuk menentukan root untuk analisis adalah menggunakan file XML yang menggunakan format deskriptor pemangkas. Ini memungkinkan Anda membasar anggota tertentu alih-alih rakitan keseluruhan.
<ItemGroup>
<TrimmerRootDescriptor Include="MyRoots.xml" />
</ItemGroup>
Misalnya, MyRoots.xml
mungkin mengakar metode tertentu yang diakses secara dinamis oleh aplikasi:
<linker>
<assembly fullname="MyAssembly">
<type fullname="MyAssembly.MyClass">
<method name="DynamicallyAccessedMethod" />
</type>
</assembly>
</linker>
Peringatan analisis
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
Aktifkan peringatan analisis pemangkasan.
Pemangkasan menghapus IL yang tidak dapat dijangkau secara statis. Aplikasi yang menggunakan refleksi atau pola lain yang membuat dependensi dinamis mungkin rusak dengan pemangkasan. Untuk memperingatkan tentang pola tersebut, atur <SuppressTrimAnalysisWarnings>
ke false
. Pengaturan ini akan menampilkan peringatan tentang seluruh aplikasi, termasuk kode, kode pustaka, dan kode kerangka kerja Anda sendiri.
Penganalisis Roslyn
Pengaturan PublishTrimmed
di .NET 6+ juga memungkinkan penganalisis Roslyn yang menunjukkan serangkaian peringatan analisis terbatas . Anda juga dapat mengaktifkan atau menonaktifkan penganalisis secara independen dari PublishTrimmed
.
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
Aktifkan penganalisis Roslyn untuk subset peringatan analisis pemangkasan.
Menutupi peringatan
Anda dapat menekan kode peringatan individual menggunakan properti MSBuild biasa yang dihormati oleh toolchain, termasuk NoWarn
, , WarningsAsErrors
WarningsNotAsErrors
, dan TreatWarningsAsErrors
. Ada opsi tambahan yang mengontrol perilaku peringatan sebagai kesalahan ILLink secara independen:
<ILLinkTreatWarningsAsErrors>false</ILLinkTreatWarningsAsErrors>
Jangan perlakukan peringatan ILLink sebagai kesalahan. Ini mungkin berguna untuk menghindari mengubah peringatan analisis pemangkasan menjadi kesalahan saat memperlakukan peringatan kompilator sebagai kesalahan secara global.
Tampilkan peringatan terperinci
Dalam .NET 6+, analisis pemangkasan menghasilkan paling banyak satu peringatan untuk setiap rakitan yang berasal dari PackageReference
, yang menunjukkan bahwa internal rakitan tidak kompatibel dengan pemangkasan. Anda juga dapat menampilkan peringatan individual untuk semua rakitan:
<TrimmerSingleWarn>false</TrimmerSingleWarn>
Tampilkan semua peringatan terperinci, alih-alih menciutkannya ke satu peringatan per perakitan.
Menghapus simbol
Simbol biasanya dipangkas agar sesuai dengan rakitan yang dipangkas. Anda juga dapat menghapus semua simbol:
<TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
Hapus simbol dari aplikasi yang dipangkas, termasuk PDB yang disematkan dan file PDB terpisah. Ini berlaku untuk kode aplikasi dan dependensi apa pun yang disertakan dengan simbol.
SDK juga memungkinkan untuk menonaktifkan dukungan debugger menggunakan properti DebuggerSupport
. Ketika dukungan debugger dinonaktifkan, pemangkasan akan menghapus simbol secara otomatis (TrimmerRemoveSymbols
akan default ke true).
Memangkas fitur pustaka kerangka kerja
Beberapa area fitur pustaka kerangka kerja dilengkapi dengan arahan pemangkas yang memungkinkan untuk menghapus kode untuk fitur yang dinonaktifkan.
<AutoreleasePoolSupport>false</AutoreleasePoolSupport>
(default)Hapus kode yang membuat kumpulan penghapusan otomatis pada platform yang didukung. Lihat AutoreleasePool untuk utas terkelola. Ini adalah default untuk .NET SDK.
<DebuggerSupport>false</DebuggerSupport>
Hapus kode yang memungkinkan pengalaman penelusuran kesalahan yang lebih baik. Pengaturan ini juga menghapus simbol.
<EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>
Hapus dukungan serialisasi BinaryFormatter. Untuk informasi selengkapnya, lihat Metode serialisasi BinaryFormatter sudah usang.
<EnableUnsafeUTF7Encoding>false</EnableUnsafeUTF7Encoding>
Hapus kode pengodean UTF-7 yang tidak aman. Untuk informasi selengkapnya, lihat Jalur kode UTF-7 sudah usang.
<EventSourceSupport>false</EventSourceSupport>
Hapus kode atau logika terkait EventSource.
<HttpActivityPropagationSupport>false</HttpActivityPropagationSupport>
Hapus kode yang terkait dengan dukungan diagnostik untuk System.Net.Http.
<InvariantGlobalization>true</InvariantGlobalization>
Hapus kode dan data khusus globalisasi. Untuk mengetahui informasi selengkapnya, lihat Mode Invarian.
<MetadataUpdaterSupport>false</MetadataUpdaterSupport>
Hapus logika khusus pembaruan metadata yang terkait dengan hot reload.
<StackTraceSupport>false</StackTraceSupport>
(.NET 8+)Hapus dukungan untuk menghasilkan jejak tumpukan (misalnya, Environment.StackTrace, atau Exception.ToString) oleh runtime. Jumlah informasi yang akan dihapus dari string pelacakan tumpukan mungkin bergantung pada opsi penyebaran lainnya. Opsi ini tidak memengaruhi jejak tumpukan yang dihasilkan oleh debugger.
<UseNativeHttpHandler>true</UseNativeHttpHandler>
Gunakan implementasi platform default HttpMessageHandler untuk Android/iOS dan hapus implementasi terkelola.
<UseSystemResourceKeys>true</UseSystemResourceKeys>
Hapus pesan pengecualian untuk
System.*
rakitan. Ketika pengecualian dilemparkan dariSystem.*
rakitan, pesan adalah ID sumber daya yang disederhanakan alih-alih pesan lengkap.
Properti ini menyebabkan kode terkait dipangkas dan juga menonaktifkan fitur melalui file runtimeconfig . Untuk informasi selengkapnya tentang properti ini, termasuk opsi runtimeconfig yang sesuai, lihat sakelar fitur. Beberapa SDK mungkin memiliki nilai default untuk properti ini.
Fitur kerangka kerja dinonaktifkan saat pemangkasan
Fitur berikut tidak kompatibel dengan pemangkasan karena memerlukan kode yang tidak dirujuk secara statis. Fitur-fitur ini dinonaktifkan secara default di aplikasi yang dipangkas.
Peringatan
Aktifkan fitur-fitur ini dengan risiko Anda sendiri. Mereka cenderung memutus aplikasi yang dipangkas tanpa pekerjaan tambahan untuk mempertahankan kode yang direferensikan secara dinamis.
<BuiltInComInteropSupport>
Dukungan COM bawaan dinonaktifkan.
<CustomResourceTypesSupport>
Penggunaan jenis sumber daya kustom tidak didukung. Jalur kode ResourceManager yang menggunakan pantulan untuk jenis sumber daya kustom dipangkas.
<EnableCppCLIHostActivation>
Aktivasi host C++/CLI dinonaktifkan.
<EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization>
DesigntimeLicenseContextSerializer penggunaan
BinaryFormatter
serialisasi dinonaktifkan.<StartupHookSupport>
Menjalankan kode sebelumnya
Main
denganDOTNET_STARTUP_HOOKS
tidak didukung. Untuk informasi selengkapnya, lihat hook startup host.
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