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 partialfull. 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 ItemGroupManagedAssemblyToLink 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. Pengaturan TrimMode 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, , WarningsAsErrorsWarningsNotAsErrors, 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 dari System.* 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 dengan DOTNET_STARTUP_HOOKS tidak didukung. Untuk informasi selengkapnya, lihat hook startup host.