Bagikan melalui


Pustaka .NET inti memecahkan perubahan di .NET Core 1.0-3.0

Pustaka .NET inti menyediakan primitif dan jenis umum lainnya yang digunakan oleh .NET Core.

Perubahan mencolok berikut ini didokumenkan di halaman ini:

Breaking change Versi yang diperkenalkan
Meneruskan GroupCollection ke metode ekstensi mengambil IEnumerable<T> memerlukan disambiguasi .NET Core 3.0
API yang melaporkan versi sekarang melaporkan produk dan bukan versi file .NET Core 3.0
Instans EncoderFallbackBuffer kustom tidak dapat mundur secara rekursif .NET Core 3.0
Perubahan perilaku pemformatan dan penguraian titik mengambang .NET Core 3.0
Operasi penguraian floating-point tidak lagi gagal atau melempar OverflowException .NET Core 3.0
InvalidAsynchronousStateException dipindahkan ke rakitan lain .NET Core 3.0
Mengganti urutan byte UTF-8 yang tidak terbentuk mengikuti panduan Unicode .NET Core 3.0
TypeDescriptionProviderAttribute dipindahkan ke rakitan lain .NET Core 3.0
ZipArchiveEntry tidak lagi menangani arsip dengan ukuran entri yang tidak konsisten .NET Core 3.0
FieldInfo.SetValue melempar pengecualian untuk bidang statis khusus init .NET Core 3.0
API Jalur tidak melemparkan pengecualian untuk karakter yang tidak valid .NET Core 2.1
Bidang privat ditambahkan ke jenis struct bawaan .NET Core 2.1
Perubahan nilai default UseShellExecute .NET Core 2.1
Versi OpenSSL di macOS .NET Core 2.1
UnauthorizedAccessException dilemparkan oleh FileSystemInfo.Attributes .NET Core 1.0
Menangani pengecualian status proses yang rusak tidak didukung .NET Core 1.0
Properti UriBuilder tidak lagi menambahkan karakter utama .NET Core 1.0
Process.StartInfo melempar InvalidOperationException untuk proses yang tidak Anda mulai .NET Core 1.0

.NET Core 3.0

Meneruskan GroupCollection ke metode ekstensi mengambil IEnumerable<T> memerlukan disambiguasi

Saat memanggil metode ekstensi yang mengambil IEnumerable<T> pada GroupCollection, Anda harus membedakan jenis menggunakan cast.

Deskripsi perubahan

Mulai dari .NET Core 3.0, System.Text.RegularExpressions.GroupCollection mengimplementasikan IEnumerable<KeyValuePair<String,Group>> selain jenis lain yang diterapkannya, termasuk IEnumerable<Group>. Ini menghasilkan ambiguitas saat memanggil metode ekstensi yang mengambil IEnumerable<T>. Jika Anda memanggil metode ekstensi seperti itu pada GroupCollection instans, misalnya, Enumerable.Count, Anda akan melihat kesalahan pengkompilasi berikut:

CS1061: 'GroupCollection' tidak berisi definisi untuk 'Count' dan tidak ada metode ekstensi yang dapat diakses 'Count' yang menerima argumen pertama jenis 'GroupCollection' dapat ditemukan (apakah Anda kehilangan menggunakan direktif atau referensi perakitan?)

Dalam versi .NET sebelumnya, tidak ada ambiguitas dan tidak ada kesalahan kompilator.

Versi yang diperkenalkan

3.0

Alasan untuk berubah

Ini adalah perubahan melanggar yang tidak disengaja. Karena sudah seperti ini untuk beberapa waktu, kami tidak berencana untuk mengembalikannya. Selain itu, perubahan seperti itu sendiri akan melanggar.

Misalnya GroupCollection , disambiguasi panggilan ke metode ekstensi yang menerima IEnumerable<T> dengan cast.

// Without a cast - causes CS1061.
match.Groups.Count(_ => true)

// With a disambiguating cast.
((IEnumerable<Group>)m.Groups).Count(_ => true);

Kategori

Pustaka .NET Inti

API yang Terpengaruh

Metode ekstensi apa pun yang menerima IEnumerable<T> terpengaruh. Misalnya:


API yang melaporkan versi sekarang melaporkan produk dan bukan versi file

Banyak API yang mengembalikan versi di .NET Core sekarang mengembalikan versi produk daripada versi file.

Deskripsi perubahan

Di .NET Core 2.2 dan versi sebelumnya, metode seperti Environment.Version, RuntimeInformation.FrameworkDescription, dan dialog properti file untuk rakitan .NET Core mencerminkan versi file. Dimulai dengan .NET Core 3.0, mereka mencerminkan versi produk.

Gambar berikut mengilustrasikan perbedaan informasi versi untuk rakitan System.Runtime.dll untuk .NET Core 2.2 (di sebelah kiri) dan .NET Core 3.0 (di sebelah kanan) seperti yang ditampilkan oleh dialog properti file Windows Explorer .

Difference in product version information

Versi yang diperkenalkan

3.0

Tidak ada. Perubahan ini harus membuat deteksi versi intuitif daripada obtuse.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Instans EncoderFallbackBuffer kustom tidak dapat mundur secara rekursif

Instans kustom EncoderFallbackBuffer tidak dapat mundur secara rekursif. Implementasi EncoderFallbackBuffer.GetNextChar() harus menghasilkan urutan karakter yang dapat dikonversi ke pengodean tujuan. Jika tidak, pengecualian terjadi.

Deskripsi perubahan

Selama operasi transcoding karakter-ke-byte, runtime mendeteksi urutan UTF-16 yang tidak terbentuk atau tidak dapat dikonvertbel dan menyediakan karakter tersebut EncoderFallbackBuffer.Fallback ke metode . Metode menentukan Fallback karakter mana yang harus diganti untuk data asli yang tidak dapat dikonvertbel, dan karakter ini dikosongkan dengan memanggil EncoderFallbackBuffer.GetNextChar dalam perulangan.

Runtime kemudian mencoba untuk mentranskode karakter substitusi ini ke pengodean target. Jika operasi ini berhasil, runtime melanjutkan transcoding dari tempatnya ditinggalkan dalam string input asli.

Sebelumnya, implementasi EncoderFallbackBuffer.GetNextChar() kustom dapat mengembalikan urutan karakter yang tidak dapat dikonversi ke pengodean tujuan. Jika karakter yang diganti tidak dapat ditranskodekan ke pengodean target, runtime memanggil EncoderFallbackBuffer.Fallback metode sekali lagi dengan karakter pengganti, mengharapkan EncoderFallbackBuffer.GetNextChar() metode untuk mengembalikan urutan penggantian baru. Proses ini berlanjut sampai runtime akhirnya melihat substitusi yang terbentuk dengan baik, dapat dikonversi, atau sampai jumlah rekursi maksimum tercapai.

Dimulai dengan .NET Core 3.0, implementasi EncoderFallbackBuffer.GetNextChar() kustom harus mengembalikan urutan karakter yang dapat dikonversi ke pengodean tujuan. Jika karakter yang diganti tidak dapat ditranskodekan ke pengodean target, akan ArgumentException dilemparkan. Runtime tidak akan lagi melakukan panggilan rekursif ke EncoderFallbackBuffer dalam instans.

Perilaku ini hanya berlaku ketika ketiga kondisi berikut terpenuhi:

  • Runtime mendeteksi urutan UTF-16 yang tidak terbentuk atau urutan UTF-16 yang tidak dapat dikonversi ke pengodean target.
  • Kustom EncoderFallback telah ditentukan.
  • Upaya kustom EncoderFallback untuk mengganti urutan UTF-16 baru yang tidak terbentuk atau tidak dapat dikonversi.

Versi yang diperkenalkan

3.0

Sebagian besar pengembang tidak perlu mengambil tindakan apa pun.

Jika aplikasi menggunakan kustom EncoderFallback dan EncoderFallbackBuffer kelas, pastikan implementasi EncoderFallbackBuffer.Fallback mengisi buffer fallback dengan data UTF-16 yang terbentuk dengan baik yang langsung dapat dikonversi ke pengodean target ketika Fallback metode pertama kali dipanggil oleh runtime.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Perilaku pemformatan dan penguraian titik mengambang berubah

Perilaku penguraian dan pemformatan titik mengambang (berdasarkan Double jenis dan Single ) sekarang sesuai dengan IEEE. Ini memastikan bahwa perilaku jenis floating-point di .NET cocok dengan bahasa lain yang sesuai dengan IEEE. Misalnya, double.Parse("SomeLiteral") harus selalu cocok dengan apa yang dihasilkan C# untuk double x = SomeLiteral.

Deskripsi perubahan

Di .NET Core 2.2 dan versi yang lebih lama, pemformatan dengan Double.ToString dan Single.ToString, dan penguraian dengan Double.Parse, Double.TryParse, Single.Parse, dan Single.TryParse tidak sesuai dengan IEEE. Akibatnya, tidak mungkin untuk menjamin bahwa nilai akan pulang pergi dengan string format standar atau kustom yang didukung. Untuk beberapa input, upaya untuk mengurai nilai yang diformat dapat gagal, dan untuk yang lain, nilai yang diurai tidak sama dengan nilai asli.

Dimulai dengan .NET Core 3.0, operasi penguraian dan pemformatan floating-point mematuhi IEEE 754.

Tabel berikut menunjukkan dua cuplikan kode dan bagaimana output berubah antara .NET Core 2.2 dan .NET Core 3.1.

Cuplikan kode Output pada .NET Core 2.2 Output pada .NET Core 3.1
Console.WriteLine((-0.0).ToString()); 0 0-
var value = -3.123456789123456789;
Console.WriteLine(value == double.Parse(value.ToString()));
False True

Untuk informasi selengkapnya, lihat penguraian titik mengambang dan peningkatan pemformatan dalam posting blog .NET Core 3.0 .

Versi yang diperkenalkan

3.0

Bagian Dampak potensial ke kode yang ada dari penguraian titik float dan peningkatan pemformatan dalam posting blog .NET Core 3.0 menunjukkan beberapa perubahan yang dapat Anda lakukan pada kode Anda jika Anda ingin mempertahankan perilaku sebelumnya.

  • Untuk beberapa perbedaan dalam pemformatan, Anda bisa mendapatkan perilaku yang setara dengan perilaku sebelumnya dengan menentukan string format yang berbeda.
  • Untuk perbedaan penguraian, tidak ada mekanisme untuk kembali ke perilaku sebelumnya.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Operasi penguraian floating-point tidak lagi gagal atau melempar OverflowException

Metode penguraian Single floating-point tidak lagi melempar OverflowException atau mengembalikan false ketika mereka mengurai string yang nilai numeriknya berada di luar rentang jenis atau Double floating-point.

Deskripsi perubahan

Dalam .NET Core 2.2 dan versi yang lebih lama, Double.Parse metode dan Single.Parse melemparkan OverflowException untuk nilai yang di luar rentang jenisnya masing-masing. Metode Double.TryParse dan Single.TryParse mengembalikan false untuk representasi string dari nilai numerik di luar rentang.

Dimulai dengan .NET Core 3.0, Double.Parsemetode , Double.TryParse, Single.Parse, dan Single.TryParse tidak lagi gagal saat mengurai string numerik di luar rentang. Sebagai gantinya Double , metode penguraian mengembalikan Double.PositiveInfinity nilai yang melebihi Double.MaxValue, dan mereka mengembalikan Double.NegativeInfinity untuk nilai yang kurang dari Double.MinValue. Demikian pula, Single metode penguraian kembali Single.PositiveInfinity untuk nilai yang melebihi Single.MaxValue, dan mereka mengembalikan Single.NegativeInfinity untuk nilai yang kurang dari Single.MinValue.

Perubahan ini dilakukan untuk meningkatkan kepatuhan IEEE 754:2008.

Versi yang diperkenalkan

3.0

Perubahan ini dapat memengaruhi kode Anda dengan salah satu dari dua cara:

  • Kode Anda bergantung pada handler untuk OverflowException dijalankan saat luapan terjadi. Dalam hal ini, Anda harus menghapus catch pernyataan dan menempatkan kode yang If diperlukan dalam pernyataan yang menguji apakah Double.IsInfinity atau Single.IsInfinity .true

  • Kode Anda mengasumsikan bahwa nilai floating-point bukan Infinity. Dalam hal ini, Anda harus menambahkan kode yang diperlukan untuk memeriksa nilai PositiveInfinity floating-point dan NegativeInfinity.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


InvalidAsynchronousStateException dipindahkan ke rakitan lain

Kelas InvalidAsynchronousStateException telah dipindahkan.

Deskripsi perubahan

Di .NET Core 2.2 dan versi yang lebih lama, InvalidAsynchronousStateException kelas ditemukan di rakitan System.ComponentModel.TypeConverter .

Dimulai dengan .NET Core 3.0, ditemukan di rakitan System.ComponentModel.Primitives .

Versi yang diperkenalkan

3.0

Perubahan ini hanya memengaruhi aplikasi yang menggunakan pantulan untuk memuat InvalidAsynchronousStateException dengan memanggil metode seperti Assembly.GetType atau kelebihan beban Activator.CreateInstance yang mengasumsikan jenisnya berada dalam rakitan tertentu. Jika demikian, perbarui rakitan yang dirujuk dalam panggilan metode untuk mencerminkan lokasi rakitan baru jenis tersebut.

Kategori

Pustaka .NET Inti

API yang Terpengaruh

Tidak ada.


Mengganti urutan byte UTF-8 yang tidak terbentuk mengikuti panduan Unicode

UTF8Encoding Ketika kelas mengalami urutan byte UTF-8 yang tidak terbentuk selama operasi transcoding byte-to-character, kelas mengganti urutan tersebut dengan karakter ' ' (KARAKTER PENGGANTIan U+FFFD) dalam string output. .NET Core 3.0 berbeda dari versi .NET Core dan .NET Framework sebelumnya dengan mengikuti praktik terbaik Unicode untuk melakukan penggantian ini selama operasi transcoding.

Ini adalah bagian dari upaya yang lebih besar untuk meningkatkan penanganan UTF-8 di seluruh .NET, termasuk oleh yang baru System.Text.Unicode.Utf8 dan System.Text.Rune jenis. Jenis ini UTF8Encoding diberikan mekanisme penanganan kesalahan yang ditingkatkan sehingga menghasilkan output yang konsisten dengan jenis yang baru diperkenalkan.

Deskripsi perubahan

Dimulai dengan .NET Core 3.0, saat transcoding byte ke karakter, UTF8Encoding kelas melakukan penggantian karakter berdasarkan praktik terbaik Unicode. Mekanisme substitusi yang digunakan dijelaskan oleh The Unicode Standard, Version 12.0, Sec. 3.9 (PDF) dalam judul berjudul Subsitusi U+FFFD Subbagian Maksimal.

Perilaku ini hanya berlaku ketika urutan byte input berisi data UTF-8 yang tidak terbentuk. Selain itu, jika UTF8Encoding instans telah dibangun dengan throwOnInvalidBytes: true, UTF8Encoding instans akan terus melemparkan input yang tidak valid daripada melakukan penggantian U+FFFD. Untuk informasi selengkapnya tentang UTF8Encoding konstruktor, lihat UTF8Encoding(Boolean, Boolean).

Tabel berikut mengilustrasikan dampak perubahan ini dengan input 3-byte yang tidak valid:

Input 3 byte yang tidak terbentuk Output sebelum .NET Core 3.0 Output dimulai dengan .NET Core 3.0
[ ED A0 90 ] [ FFFD FFFD ] (output 2 karakter) [ FFFD FFFD FFFD ] (output 3 karakter)

Output 3 karakter adalah output pilihan, menurut Tabel 3-9 dari PDF Standar Unicode yang ditautkan sebelumnya.

Versi yang diperkenalkan

3.0

Tidak ada tindakan yang diperlukan pada bagian pengembang.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


TypeDescriptionProviderAttribute dipindahkan ke rakitan lain

Kelas TypeDescriptionProviderAttribute telah dipindahkan.

Deskripsi perubahan

Di .NET Core 2.2 dan versi yang lebih lama, Kelas TypeDescriptionProviderAttribute ini ditemukan di rakitan System.ComponentModel.TypeConverter .

Dimulai dengan .NET Core 3.0, ditemukan di rakitan System.ObjectModel .

Versi yang diperkenalkan

3.0

Perubahan ini hanya memengaruhi aplikasi yang menggunakan pantulan untuk memuat TypeDescriptionProviderAttribute jenis dengan memanggil metode seperti Assembly.GetType atau kelebihan beban Activator.CreateInstance yang mengasumsikan jenisnya berada dalam rakitan tertentu. Jika demikian, rakitan yang dirujuk dalam panggilan metode harus diperbarui untuk mencerminkan lokasi perakitan baru jenis tersebut.

Kategori

Formulir Windows

API yang Terpengaruh

Tidak ada.


ZipArchiveEntry tidak lagi menangani arsip dengan ukuran entri yang tidak konsisten

Arsip Zip mencantumkan ukuran terkompresi dan ukuran yang tidak dikompresi di direktori pusat dan header lokal. Data entri itu sendiri juga menunjukkan ukurannya. Di .NET Core 2.2 dan versi yang lebih lama, nilai-nilai ini tidak pernah diperiksa untuk konsistensi. Dimulai dengan .NET Core 3.0, sekarang.

Deskripsi perubahan

Di .NET Core 2.2 dan versi yang lebih lama, ZipArchiveEntry.Open() berhasil bahkan jika header lokal tidak setuju dengan header pusat file zip. Data didekompresi hingga akhir aliran terkompresi tercapai, bahkan jika panjangnya melebihi ukuran file yang tidak dikompresi yang tercantum di direktori pusat/header lokal.

Dimulai dengan .NET Core 3.0, ZipArchiveEntry.Open() metode memeriksa bahwa header lokal dan header pusat setuju pada ukuran entri yang dikompresi dan tidak dikompresi. Jika tidak, metode melemparkan InvalidDataException jika header lokal arsip dan/atau ukuran daftar deskriptor data yang tidak setuju dengan direktori pusat file zip. Saat membaca entri, data yang didekompresi dipotong ke ukuran file yang tidak dikompresi yang tercantum di header.

Perubahan ini dilakukan untuk memastikan bahwa ZipArchiveEntry dengan benar mewakili ukuran datanya dan hanya jumlah data yang dibaca.

Versi yang diperkenalkan

3.0

Mengemas ulang arsip zip apa pun yang menunjukkan masalah ini.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


FieldInfo.SetValue melempar pengecualian untuk bidang statis khusus init

Mulai dari .NET Core 3.0, pengecualian dilemparkan ketika Anda mencoba mengatur nilai pada bidang statis dengan InitOnly memanggil System.Reflection.FieldInfo.SetValue.

Deskripsi perubahan

Dalam .NET Framework dan versi .NET Core sebelum 3.0, Anda dapat mengatur nilai bidang statis yang konstan setelah diinisialisasi (baca saja di C#) dengan memanggil System.Reflection.FieldInfo.SetValue. Namun, pengaturan bidang seperti itu dengan cara ini mengakibatkan perilaku yang tidak dapat diprediksi berdasarkan kerangka kerja target dan pengaturan pengoptimalan.

Di .NET Core 3.0 dan versi yang lebih baru, saat Anda memanggil SetValue bidang statis, InitOnly System.FieldAccessException pengecualian akan dilemparkan.

Tip

Bidang InitOnly adalah bidang yang hanya dapat diatur pada saat dideklarasikan atau di konstruktor untuk kelas yang berisi. Dengan kata lain, konstan setelah diinisialisasi.

Versi yang diperkenalkan

3.0

Menginisialisasi bidang statis InitOnly dalam konstruktor statis. Ini berlaku untuk jenis dinamis dan non-dinamis.

Atau, Anda dapat menghapus FieldAttributes.InitOnly atribut dari bidang, lalu memanggil FieldInfo.SetValue.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


.NET Core 2.1

API Jalur tidak melemparkan pengecualian untuk karakter yang tidak valid

API yang melibatkan jalur file tidak lagi memvalidasi karakter jalur atau melempar ArgumentException jika karakter yang tidak valid ditemukan.

Deskripsi perubahan

Di .NET Framework dan .NET Core 1.0 - 2.0, metode yang tercantum di bagian API yang Terpengaruh melemparkan ArgumentException jika argumen jalur berisi karakter jalur yang tidak valid. Mulai dari .NET Core 2.1, metode ini tidak lagi memeriksa karakter jalur yang tidak valid atau melempar pengecualian jika karakter yang tidak valid ditemukan.

Alasan untuk berubah

Validasi karakter jalur yang agresif memblokir beberapa skenario lintas platform. Perubahan ini diperkenalkan sehingga .NET tidak mencoba mereplikasi atau memprediksi hasil panggilan API sistem operasi. Untuk informasi selengkapnya, lihat System.IO di posting blog intip .NET Core 2.1.

Versi yang diperkenalkan

.NET Core 2.1

Jika kode Anda mengandalkan API ini untuk memeriksa karakter yang tidak valid, Anda dapat menambahkan panggilan ke Path.GetInvalidPathChars.

API yang Terpengaruh

Lihat juga


Bidang privat ditambahkan ke jenis struct bawaan

Bidang privat ditambahkan ke jenis struktur tertentu dalam rakitan referensi. Akibatnya, dalam C#, jenis struct tersebut harus selalu dibuat dengan menggunakan operator baru atau literal default.

Deskripsi perubahan

Dalam .NET Core 2.0 dan versi sebelumnya, beberapa jenis struct yang disediakan, misalnya, ConsoleKeyInfo, dapat dibuat tanpa menggunakan new operator atau literal default di C#. Ini karena rakitan referensi yang digunakan oleh pengkompilasi C# tidak berisi bidang privat untuk struktur. Semua bidang privat untuk jenis struct .NET ditambahkan ke rakitan referensi mulai dari .NET Core 2.1.

Misalnya, kode C# berikut dikompilasi di .NET Core 2.0, tetapi tidak dalam .NET Core 2.1:

ConsoleKeyInfo key;    // Struct type

if (key.ToString() == "y")
{
    Console.WriteLine("Yes!");
}

Di .NET Core 2.1, kode sebelumnya menghasilkan kesalahan kompilator berikut: CS0165 - Penggunaan variabel lokal 'kunci' yang tidak ditetapkan

Versi yang diperkenalkan

2.1

Buat instans jenis struct dengan menggunakan new operator atau literal default.

Misalnya:

ConsoleKeyInfo key = new ConsoleKeyInfo();    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");
ConsoleKeyInfo key = default;    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Perubahan nilai default UseShellExecute

ProcessStartInfo.UseShellExecute memiliki nilai false default pada .NET Core. Pada .NET Framework, nilai defaultnya adalah true.

Deskripsi perubahan

Process.Start memungkinkan Anda meluncurkan aplikasi secara langsung, misalnya, dengan kode seperti Process.Start("mspaint.exe") yang meluncurkan Paint. Ini juga memungkinkan Anda secara tidak langsung meluncurkan aplikasi terkait jika ProcessStartInfo.UseShellExecute diatur ke true. Pada .NET Framework, nilai default untuk ProcessStartInfo.UseShellExecute adalah true, yang berarti bahwa kode seperti Process.Start("mytextfile.txt") akan meluncurkan Notepad, jika Anda telah mengaitkan file .txt dengan editor tersebut. Untuk mencegah peluncuran aplikasi secara tidak langsung di .NET Framework, Anda harus secara eksplisit mengatur ProcessStartInfo.UseShellExecute ke false. Pada .NET Core, nilai default untuk ProcessStartInfo.UseShellExecute adalah false. Ini berarti bahwa, secara default, aplikasi terkait tidak diluncurkan saat Anda memanggil Process.Start.

Properti System.Diagnostics.ProcessStartInfo berikut ini hanya berfungsi ketika ProcessStartInfo.UseShellExecute adalah true:

Perubahan ini diperkenalkan di .NET Core karena alasan performa. Biasanya, Process.Start digunakan untuk meluncurkan aplikasi secara langsung. Meluncurkan aplikasi secara langsung tidak perlu melibatkan shell Windows dan dikenakan biaya performa terkait. Untuk membuat kasus default ini lebih cepat, .NET Core mengubah nilai default menjadi ProcessStartInfo.UseShellExecute false. Anda dapat ikut serta ke jalur yang lebih lambat jika Anda membutuhkannya.

Versi yang diperkenalkan

2.1

Catatan

Dalam versi .NET Core yang lebih lama, UseShellExecute tidak diimplementasikan untuk Windows.

Jika aplikasi Anda bergantung pada perilaku lama, panggil Process.Start(ProcessStartInfo) dengan UseShellExecute diatur ke true ProcessStartInfo pada objek.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Versi OpenSSL di macOS

Runtime .NET Core 3.0 dan yang lebih baru di macOS sekarang lebih memilih versi OpenSSL 1.1.x ke versi OpenSSL 1.0.x untuk AesCcmjenis , , AesGcm, DSAOpenSslECDsaOpenSslECDiffieHellmanOpenSsl, RSAOpenSsl, dan .SafeEvpPKeyHandle

Runtime .NET Core 2.1 sekarang mendukung versi OpenSSL 1.1.x, tetapi masih lebih suka versi OpenSSL 1.0.x.

Deskripsi perubahan

Sebelumnya, runtime .NET Core menggunakan versi OpenSSL 1.0.x di macOS untuk jenis yang berinteraksi dengan OpenSSL. Versi OpenSSL 1.0.x terbaru, OpenSSL 1.0.2, sekarang tidak didukung. Untuk menyimpan jenis yang menggunakan OpenSSL pada versi OpenSSL yang didukung, runtime .NET Core 3.0 dan yang lebih baru sekarang menggunakan versi OpenSSL yang lebih baru di macOS.

Dengan perubahan ini, perilaku untuk runtime .NET Core di macOS adalah sebagai berikut:

  • Runtime versi .NET Core 3.0 dan yang lebih baru menggunakan OpenSSL 1.1.x, jika tersedia, dan kembali ke OpenSSL 1.0.x hanya jika tidak ada versi 1.1.x yang tersedia.

    Untuk penelepon yang menggunakan jenis interop OpenSSL dengan P/Invoke kustom, ikuti panduan dalam SafeEvpPKeyHandle.OpenSslVersion keterangan. Aplikasi Anda mungkin mengalami crash jika Anda tidak memeriksa nilainya OpenSslVersion .

  • Runtime .NET Core 2.1 menggunakan OpenSSL 1.0.x, jika tersedia, dan kembali ke OpenSSL 1.1.x jika tidak ada versi 1.0.x yang tersedia.

    Runtime 2.1 lebih memilih versi OpenSSL yang lebih lama karena SafeEvpPKeyHandle.OpenSslVersion properti tidak ada di .NET Core 2.1, sehingga versi OpenSSL tidak dapat ditentukan dengan andal pada waktu proses.

Versi yang diperkenalkan

  • .NET Core 2.1.16
  • .NET Core 3.0.3
  • .NET Core 3.1.2

Kategori

Pustaka .NET Inti

API yang Terpengaruh


.NET Core 1.0

UnauthorizedAccessException dilemparkan oleh FileSystemInfo.Attributes

Di .NET Core, pemanggil UnauthorizedAccessException mencoba mengatur nilai atribut file tetapi tidak memiliki izin tulis.

Deskripsi perubahan

Di .NET Framework, pemanggil ArgumentException mencoba mengatur nilai atribut file tetapi FileSystemInfo.Attributes tidak memiliki izin tulis. Di .NET Core, dilemparkan UnauthorizedAccessException sebagai gantinya. (Di .NET Core, ArgumentException masih dilemparkan jika pemanggil mencoba mengatur atribut file yang tidak valid.)

Versi yang diperkenalkan

1.0

Ubah pernyataan apa pun catch untuk menangkap UnauthorizedAccessException alih-alih, atau selain, ArgumentException, seperlunya.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Menangani pengecualian status yang rusak tidak didukung

Menangani pengecualian status proses yang rusak di .NET Core tidak didukung.

Deskripsi perubahan

Sebelumnya, pengecualian status proses yang rusak dapat ditangkap dan ditangani oleh handler pengecualian kode terkelola, misalnya, dengan menggunakan pernyataan try-catch di C#.

Mulai dari .NET Core 1.0, pengecualian status proses yang rusak tidak dapat ditangani oleh kode terkelola. Runtime bahasa umum tidak memberikan pengecualian status proses yang rusak ke kode terkelola.

Versi yang diperkenalkan

1.0

Hindari kebutuhan untuk menangani pengecualian status proses yang rusak dengan mengatasi situasi yang mengarah padanya sebagai gantinya. Jika benar-benar diperlukan untuk menangani pengecualian status proses yang rusak, tulis handler pengecualian dalam kode C atau C++.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Properti UriBuilder tidak lagi menambahkan karakter utama

UriBuilder.Fragment tidak lagi menambahkan karakter utama # dan UriBuilder.Query tidak lagi menambahkan karakter utama ? ketika karakter sudah ada.

Deskripsi perubahan

Dalam .NET Framework, UriBuilder.Fragment properti dan UriBuilder.Query selalu menambahkan # masing-masing karakter atau ? ke nilai yang disimpan. Perilaku ini dapat menghasilkan beberapa # ? karakter dalam nilai tersimpan jika string sudah berisi salah satu karakter utama ini. Misalnya, nilai UriBuilder.Fragment mungkin menjadi ##main.

Mulai dari .NET Core 1.0, properti ini tidak lagi menambahkan # karakter atau ? ke nilai tersimpan jika sudah ada di awal string.

Versi yang diperkenalkan

1.0

Anda tidak perlu lagi secara eksplisit menghapus salah satu karakter utama ini saat mengatur nilai properti. Ini sangat berguna ketika Anda menambahkan nilai, karena Anda tidak lagi harus menghapus yang terkemuka # atau ? setiap kali Anda menambahkan.

Misalnya, cuplikan kode berikut menunjukkan perbedaan perilaku antara .NET Framework dan .NET Core.

var builder = new UriBuilder();
builder.Query = "one=1";
builder.Query += "&two=2";
builder.Query += "&three=3";
builder.Query += "&four=4";

Console.WriteLine(builder.Query);
  • Dalam .NET Framework, outputnya adalah ????one=1&two=2&three=3&four=4.
  • Di .NET Core, outputnya adalah ?one=1&two=2&three=3&four=4.

Kategori

Pustaka .NET Inti

API yang Terpengaruh


Process.StartInfo melempar InvalidOperationException untuk proses yang tidak Anda mulai

Process.StartInfo Membaca properti untuk proses yang kode Anda tidak mulai melempar .InvalidOperationException

Deskripsi perubahan

Di .NET Framework, mengakses Process.StartInfo properti untuk proses yang kode Anda tidak mulai mengembalikan objek dummy ProcessStartInfo . Objek dummy berisi nilai default untuk semua propertinya kecuali EnvironmentVariables.

Mulai dari .NET Core 1.0, jika Anda membaca Process.StartInfo properti untuk proses yang tidak Anda mulai (yaitu, dengan memanggil Process.Start), akan InvalidOperationException dilemparkan.

Versi yang diperkenalkan

1.0

Jangan akses Process.StartInfo properti untuk proses yang tidak dimulai kode Anda. Misalnya, jangan baca properti ini untuk proses yang dikembalikan oleh Process.GetProcesses.

Kategori

Pustaka .NET Inti

API yang Terpengaruh