Bagikan melalui


Apa yang baru dalam SDK dan alat untuk .NET 8

Artikel ini menjelaskan fitur baru di .NET SDK dan alat untuk .NET 8.

SDK

Bagian ini berisi subtopik berikut:

Evaluasi proyek berbasis CLI

MSBuild menyertakan fitur baru yang memudahkan untuk menggabungkan data dari MSBuild ke dalam skrip atau alat Anda. Bendera baru berikut tersedia untuk perintah CLI seperti penerbitan dotnet untuk mendapatkan data untuk digunakan dalam alur CI dan di tempat lain.

Bendera Deskripsi
--getProperty:<PROPERTYNAME> Mengambil properti MSBuild dengan nama yang ditentukan.
--getItem:<ITEMTYPE> Mengambil item MSBuild dari jenis yang ditentukan.
--getTargetResults:<TARGETNAME> Mengambil output dari menjalankan target yang ditentukan.

Nilai ditulis ke output standar. Beberapa nilai kompleks atau output sebagai JSON, seperti yang ditunjukkan dalam contoh berikut.

>dotnet publish --getProperty:OutputPath
bin\Release\net8.0\
>dotnet publish -p PublishProfile=DefaultContainer --getProperty:GeneratedContainerDigest --getProperty:GeneratedContainerConfiguration
{
  "Properties": {
    "GeneratedContainerDigest": "sha256:ef880a503bbabcb84bbb6a1aa9b41b36dc1ba08352e7cd91c0993646675174c4",
    "GeneratedContainerConfiguration": "{\u0022config\u0022:{\u0022ExposedPorts\u0022:{\u00228080/tcp\u0022:{}},\u0022Labels\u0022...}}"
  }
}
>dotnet publish -p PublishProfile=DefaultContainer --getItem:ContainerImageTags
{
  "Items": {
    "ContainerImageTags": [
      {
        "Identity": "latest",
        ...
    ]
  }
}

Output build terminal

dotnet build memiliki opsi baru untuk menghasilkan output build yang lebih modern. Pencatat terminal ini mengelompokkan kesalahan dengan proyek asalnya, membedakan kerangka kerja target yang berbeda untuk proyek multi-target, dan memberikan informasi real-time tentang apa yang dilakukan build. Untuk memilih output baru, gunakan --tl opsi . Untuk informasi selengkapnya tentang opsi ini, lihat opsi build dotnet.

Jalur output yang disederhanakan

.NET 8 memperkenalkan opsi untuk menyederhanakan jalur output dan struktur folder untuk output build. Sebelumnya, aplikasi .NET menghasilkan serangkaian jalur output yang mendalam dan kompleks untuk artefak build yang berbeda. Struktur jalur output baru yang disederhanakan mengumpulkan semua output build ke lokasi umum, yang memudahkan perkakas untuk diantisipasi.

Untuk informasi selengkapnya, lihat Tata letak output Artefak.

perintah dotnet workload clean

.NET 8 memperkenalkan perintah baru untuk membersihkan paket beban kerja yang mungkin ditinggalkan melalui beberapa pembaruan .NET SDK atau Visual Studio. Jika Anda mengalami masalah saat mengelola beban kerja, pertimbangkan untuk menggunakan workload clean untuk memulihkan ke status yang diketahui dengan aman sebelum mencoba lagi. Perintah memiliki dua mode:

  • dotnet workload clean

    Menjalankan pengumpulan sampah beban kerja untuk beban kerja berbasis file atau berbasis MSI, yang membersihkan paket yatim piatu. Paket yatim piatu berasal dari versi .NET SDK atau paket yang tidak diinstal di mana catatan penginstalan untuk paket tidak ada lagi.

    Jika Visual Studio diinstal, perintah juga mencantumkan beban kerja apa pun yang harus Anda bersihkan secara manual menggunakan Visual Studio.

  • dotnet workload clean --all

    Mode ini lebih agresif dan membersihkan setiap paket pada komputer yang merupakan jenis penginstalan beban kerja SDK saat ini (dan itu bukan dari Visual Studio). Ini juga menghapus semua rekaman penginstalan beban kerja untuk pita fitur .NET SDK yang sedang berjalan dan di bawah ini.

dotnet publish dan dotnet pack aset

dotnet publish Karena perintah dan dotnet pack dimaksudkan untuk menghasilkan aset produksi, mereka sekarang menghasilkan Release aset secara default.

Output berikut menunjukkan perilaku yang berbeda antara dotnet build dan , dan bagaimana Anda dapat kembali ke aset penerbitan Debug dengan mengatur properti ke PublishRelease false.dotnet publish

/app# dotnet new console
/app# dotnet build
  app -> /app/bin/Debug/net8.0/app.dll
/app# dotnet publish
  app -> /app/bin/Release/net8.0/app.dll
  app -> /app/bin/Release/net8.0/publish/
/app# dotnet publish -p:PublishRelease=false
  app -> /app/bin/Debug/net8.0/app.dll
  app -> /app/bin/Debug/net8.0/publish/

Untuk informasi selengkapnya, lihat 'paket dotnet' menggunakan konfigurasi Rilis dan 'penerbitan dotnet' menggunakan konfigurasi Rilis.

dotnet restore audit keamanan

Mulai dari .NET 8, Anda dapat memilih pemeriksaan keamanan untuk kerentanan yang diketahui saat paket dependensi dipulihkan. Audit ini menghasilkan laporan kerentanan keamanan dengan nama paket yang terpengaruh, tingkat keparahan kerentanan, dan tautan ke saran untuk detail lebih lanjut. Ketika Anda menjalankan dotnet add atau dotnet restore, peringatan NU1901-NU1904 akan muncul untuk kerentanan apa pun yang ditemukan. Untuk informasi selengkapnya, lihat Audit untuk kerentanan keamanan.

Mesin templat

Mesin templat memberikan pengalaman yang lebih aman di .NET 8 dengan mengintegrasikan beberapa fitur terkait keamanan NuGet. Penyempurnaan tersebut meliputi:

  • Cegah mengunduh paket dari http:// umpan secara default. Misalnya, perintah berikut akan gagal menginstal paket templat karena URL sumber tidak menggunakan HTTPS.

    dotnet new install console --add-source "http://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json"

    Anda dapat mengambil alih batasan ini dengan menggunakan --force bendera .

  • Untuk dotnet new, , dotnet new installdan dotnet new update, periksa kerentanan yang diketahui dalam paket templat. Jika kerentanan ditemukan dan Anda ingin melanjutkan, Anda harus menggunakan --force bendera .

  • Untuk dotnet new, berikan informasi tentang pemilik paket templat. Kepemilikan diverifikasi oleh portal NuGet dan dapat dianggap sebagai karakteristik yang dapat dipercaya.

  • Untuk dotnet search dan dotnet uninstall, tunjukkan apakah templat diinstal dari paket yang "tepercaya"—artinya, templat menggunakan awalan yang dipesan.

Tautan Sumber sekarang disertakan dalam .NET SDK. Tujuannya adalah bahwa dengan menggabungkan Source Link ke dalam SDK, alih-alih memerlukan terpisah <PackageReference> untuk paket, lebih banyak paket akan menyertakan informasi ini secara default. Informasi tersebut akan meningkatkan pengalaman IDE untuk pengembang.

Catatan

Sebagai efek samping dari perubahan ini, informasi penerapan disertakan dalam InformationalVersion nilai pustaka dan aplikasi bawaan, bahkan yang menargetkan .NET 7 atau versi yang lebih lama. Untuk informasi selengkapnya, lihat Tautan Sumber yang disertakan dalam .NET SDK.

SDK build sumber

SDK yang dibangun distribusi Linux (source-build) sekarang memiliki kemampuan untuk membangun aplikasi mandiri menggunakan paket runtime build sumber. Paket runtime khusus distribusi dibundel dengan SDK build sumber. Selama penyebaran mandiri, paket runtime yang dibundel ini akan direferensikan, sehingga mengaktifkan fitur untuk pengguna.

Dukungan AOT asli

Opsi untuk menerbitkan sebagai AOT Asli pertama kali diperkenalkan di .NET 7. Menerbitkan aplikasi dengan Native AOT membuat versi aplikasi yang sepenuhnya mandiri yang tidak memerlukan runtime—semuanya disertakan dalam satu file. .NET 8 membawa peningkatan berikut pada penerbitan AOT Asli:

  • Menambahkan dukungan untuk arsitektur x64 dan Arm64 di macOS.

  • Mengurangi ukuran aplikasi AOT Asli di Linux hingga 50%. Tabel berikut menunjukkan ukuran aplikasi "Halo Dunia" yang diterbitkan dengan Native AOT yang menyertakan seluruh runtime .NET pada .NET 7 vs. .NET 8:

    Sistem operasi .NET 7 .NET 8
    Linux x64 (dengan -p:StripSymbols=true) 3,76 MB 1,84 MB
    Windows x64 2,85 MB 1,77 MB
  • Memungkinkan Anda menentukan preferensi pengoptimalan: ukuran atau kecepatan. Secara default, pengkompilasi memilih untuk menghasilkan kode cepat sambil memperhatikan ukuran aplikasi. Namun, Anda dapat menggunakan <OptimizationPreference> properti MSBuild untuk mengoptimalkan khusus untuk satu atau yang lain. Untuk informasi selengkapnya, lihat Mengoptimalkan penyebaran AOT.

Templat aplikasi konsol

Templat aplikasi konsol default sekarang menyertakan dukungan untuk AOT out-of-the-box. Untuk membuat proyek yang dikonfigurasi untuk kompilasi AOT, cukup jalankan dotnet new console --aot. Konfigurasi proyek yang ditambahkan dengan --aot memiliki tiga efek:

  • Menghasilkan executable mandiri asli dengan Native AOT saat Anda menerbitkan proyek, misalnya, dengan dotnet publish atau Visual Studio.
  • Memungkinkan penganalisis kompatibilitas untuk pemangkasan, AOT, dan file tunggal. Penganalisis ini memberi tahu Anda tentang bagian proyek Anda yang berpotensi bermasalah (jika ada).
  • Mengaktifkan emulasi debug-time AOT sehingga ketika Anda men-debug proyek Anda tanpa kompilasi AOT, Anda mendapatkan pengalaman serupa dengan AOT. Misalnya, jika Anda menggunakan System.Reflection.Emit dalam paket NuGet yang tidak dianotasikan untuk AOT (dan oleh karena itu terlewatkan oleh penganalisis kompatibilitas), emulasi berarti Anda tidak akan memiliki kejutan ketika Anda mencoba menerbitkan proyek dengan AOT.

Menargetkan platform seperti iOS dengan Native AOT

.NET 8 memulai pekerjaan untuk mengaktifkan dukungan AOT Asli untuk platform seperti iOS. Anda sekarang dapat membangun dan menjalankan aplikasi .NET iOS dan .NET MAUI dengan Native AOT pada platform berikut:

  • ios
  • iossimulator
  • maccatalyst
  • tvos
  • tvossimulator

Pengujian awal menunjukkan bahwa ukuran aplikasi pada disk berkurang sekitar 35% untuk aplikasi .NET iOS yang menggunakan AOT Asli alih-alih Mono. Ukuran aplikasi pada disk untuk aplikasi .NET MAUI iOS berkurang hingga 50%. Selain itu, waktu startup juga lebih cepat. Aplikasi .NET iOS memiliki waktu mulai sekitar 28% lebih cepat, sementara aplikasi .NET MAUI iOS memiliki performa startup sekitar 50% lebih baik dibandingkan mono. Dukungan .NET 8 bersifat eksperimental dan hanya langkah pertama untuk fitur secara keseluruhan. Untuk informasi selengkapnya, lihat posting blog .NET 8 Peningkatan Performa di .NET MAUI.

Dukungan AOT asli tersedia sebagai fitur keikutsertaan yang ditujukan untuk penyebaran aplikasi; Mono masih merupakan runtime default untuk pengembangan dan penyebaran aplikasi. Untuk membangun dan menjalankan aplikasi .NET MAUI dengan Native AOT pada perangkat iOS, gunakan dotnet workload install maui untuk menginstal beban kerja .NET MAUI dan dotnet new maui -n HelloMaui untuk membuat aplikasi. Kemudian, atur properti PublishAot MSBuild ke true dalam file proyek.

<PropertyGroup>
  <PublishAot>true</PublishAot>
</PropertyGroup>

Saat Anda mengatur properti yang diperlukan dan menjalankan dotnet publish seperti yang ditunjukkan dalam contoh berikut, aplikasi akan disebarkan dengan menggunakan AOT Asli.

dotnet publish -f net8.0-ios -c Release -r ios-arm64  /t:Run

Batasan

Tidak semua fitur iOS kompatibel dengan Native AOT. Demikian pula, tidak semua pustaka yang umum digunakan di iOS kompatibel dengan NativeAOT. Selain batasan penyebaran AOT Asli yang ada, daftar berikut menunjukkan beberapa batasan lain saat menargetkan platform seperti iOS:

  • Menggunakan AOT Asli hanya diaktifkan selama penyebaran aplikasi (dotnet publish).
  • Penelusuran kesalahan kode terkelola hanya didukung dengan Mono.
  • Kompatibilitas dengan kerangka kerja .NET MAUI terbatas.

Kompilasi AOT untuk aplikasi Android

Untuk mengurangi ukuran aplikasi, aplikasi MAUI .NET dan .NET yang menargetkan Android menggunakan mode kompilasi ahead-of-time (AOT) yang dibuat profilnya saat dibangun dalam mode Rilis. Kompilasi AOT yang difilter memengaruhi lebih sedikit metode daripada kompilasi AOT reguler. .NET 8 memperkenalkan <AndroidStripILAfterAOT> properti yang memungkinkan Anda ikut serta untuk kompilasi AOT lebih lanjut bagi aplikasi Android untuk mengurangi ukuran aplikasi lebih banyak lagi.

<PropertyGroup>
  <AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
</PropertyGroup>

Secara default, pengaturan AndroidStripILAfterAOT untuk true mengambil alih pengaturan default AndroidEnableProfiledAot , memungkinkan (hampir) semua metode yang dikompilasi AOT untuk dipangkas. Anda juga dapat menggunakan stripping AOT dan IL yang dibuat profilnya bersama-sama dengan secara eksplisit mengatur kedua properti ke true:

<PropertyGroup>
  <AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
  <AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>

Aplikasi Windows lintas-bawaan

Saat Anda membangun aplikasi yang menargetkan Windows pada platform non-Windows, executable yang dihasilkan sekarang diperbarui dengan sumber daya Win32 yang ditentukan—misalnya, ikon aplikasi, manifes, informasi versi.

Sebelumnya, aplikasi harus dibangun di Windows untuk memiliki sumber daya tersebut. Memperbaiki kesenjangan ini dalam dukungan lintas bangunan telah menjadi permintaan populer, karena itu adalah titik nyeri yang signifikan yang memengaruhi kompleksitas infrastruktur dan penggunaan sumber daya.

.NET di Linux

Garis besar dukungan minimum untuk Linux

Garis besar dukungan minimum untuk Linux telah diperbarui untuk .NET 8. .NET dibangun menargetkan Ubuntu 16.04, untuk semua arsitektur. Itu terutama penting untuk menentukan versi minimum glibc untuk .NET 8. .NET 8 akan gagal memulai pada versi distro yang menyertakan glibc yang lebih lama, seperti Ubuntu 14.04 atau Red Hat Enterprise Linux 7.

Untuk informasi selengkapnya, lihat Dukungan Red Hat Enterprise Linux Family.

Membangun .NET Anda sendiri di Linux

Dalam versi .NET sebelumnya, Anda dapat membangun .NET dari sumber, tetapi mengharuskan Anda membuat "tarball sumber" dari penerapan repositori dotnet/installer yang sesuai dengan rilis. Di .NET 8, itu tidak lagi diperlukan dan Anda dapat membangun .NET di Linux langsung dari repositori dotnet/dotnet . Repositori tersebut menggunakan dotnet/source-build untuk membangun runtime, alat, dan SDK .NET. Ini adalah build yang sama dengan yang digunakan Red Hat dan Canonical untuk membangun .NET.

Membangun dalam kontainer adalah pendekatan termampu bagi sebagian besar orang, karena dotnet-buildtools/prereqs gambar kontainer berisi semua dependensi yang diperlukan. Untuk informasi selengkapnya, lihat instruksi build.

Verifikasi tanda tangan NuGet

Mulai dari .NET 8, NuGet memverifikasi paket yang ditandatangani di Linux secara default. NuGet juga terus memverifikasi paket yang ditandatangani di Windows.

Sebagian besar pengguna tidak boleh melihat verifikasi. Namun, jika Anda memiliki bundel sertifikat akar yang ada yang terletak di /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem, Anda mungkin melihat kegagalan kepercayaan disertai dengan peringatan NU3042.

Anda dapat menolak verifikasi dengan mengatur variabel DOTNET_NUGET_SIGNATURE_VERIFICATION lingkungan ke false.

Analisis kode

.NET 8 menyertakan beberapa penganalisis dan perbaikan kode baru untuk membantu memverifikasi bahwa Anda menggunakan API pustaka .NET dengan benar dan efisien. Tabel berikut ini meringkas penganalisis baru.

ID Aturan Kategori Deskripsi
CA1856 Performa Diaktifkan saat ConstantExpectedAttribute atribut tidak diterapkan dengan benar pada parameter.
CA1857 Performa Diaktifkan saat parameter diannotasi dengan ConstantExpectedAttribute tetapi argumen yang disediakan bukan konstanta.
CA1858 Performa Untuk menentukan apakah string dimulai dengan awalan tertentu, lebih baik memanggil String.StartsWith daripada memanggil String.IndexOf lalu membandingkan hasilnya dengan nol.
CA1859 Performa Aturan ini merekomendasikan peningkatan jenis variabel lokal, bidang, properti, parameter metode, dan jenis pengembalian metode tertentu dari jenis antarmuka atau abstrak ke jenis konkret jika memungkinkan. Menggunakan jenis beton menyebabkan kualitas kode yang dihasilkan lebih tinggi.
CA1860 Performa Untuk menentukan apakah jenis koleksi memiliki elemen apa pun, lebih baik menggunakan Length, , Countatau IsEmpty daripada memanggil Enumerable.Any.
CA1861 Performa Array konstanta yang diteruskan sebagai argumen tidak digunakan kembali saat dipanggil berulang kali, yang menyiratkan array baru dibuat setiap kali. Untuk meningkatkan performa, pertimbangkan untuk mengekstrak array ke bidang readonly statis.
CA1865-CA1867 Performa Kelebihan karakter adalah kelebihan beban berkinerja lebih baik untuk string dengan satu karakter.
CA2021 Keandalan Enumerable.Cast<TResult>(IEnumerable) dan Enumerable.OfType<TResult>(IEnumerable) memerlukan jenis yang kompatibel agar berfungsi dengan benar. Memperlebar dan konversi yang ditentukan pengguna tidak didukung dengan jenis generik.
CA1510-CA1513 Pemeliharaan Pembantu lemparan lebih sederhana dan lebih efisien daripada blok yang if membangun instans pengecualian baru. Keempat penganalisis ini dibuat untuk pengecualian berikut: ArgumentNullException, , ArgumentExceptionArgumentOutOfRangeException dan ObjectDisposedException.

Diagnostik

C# Hot Reload mendukung modifikasi generik

Mulai dari .NET 8, C# Hot Reload mendukung modifikasi jenis generik dan metode generik. Saat Anda men-debug aplikasi konsol, desktop, seluler, atau WebAssembly dengan Visual Studio, Anda dapat menerapkan perubahan pada kelas generik dan metode generik di kode C# atau halaman Razor. Untuk informasi selengkapnya, lihat daftar lengkap pengeditan yang didukung oleh Roslyn.

Lihat juga