Perubahan penting untuk migrasi dari .NET Framework ke .NET Core
Jika Anda memigrasikan aplikasi dari .NET Framework ke .NET Core versi 1.0 hingga 3.1, perubahan mencolok yang tercantum dalam artikel ini mungkin memengaruhi Anda. Perubahan besar dikelompokkan menurut kategori, dan dalam masing-masing kategori tersebut diurutkan berdasarkan versi .NET Core saat perubahan diperkenalkan.
Nota
Artikel ini bukan daftar lengkap perubahan mencolok antara .NET Framework dan .NET Core. Perubahan signifikan yang paling penting akan ditambahkan di sini saat kami mengetahuinya.
Pustaka .NET inti
- Perubahan nilai default pada UseShellExecute
- API IDispatchImplAttribute dihapus
- UnauthorizedAccessException yang dilemparkan oleh FileSystemInfo.Attributes
- Menangani pengecualian status proses yang rusak tidak didukung
- properti UriBuilder tidak lagi menambahkan karakter utama
- Process.StartInfo melempar InvalidOperationException untuk proses yang tidak Anda mulai
.NET 8
API IDispatchImplAttribute telah dihapus
.NET Core 2.1
Perubahan nilai default UseShellExecute
ProcessStartInfo.UseShellExecute memiliki nilai default false
pada .NET Core. Pada .NET Framework, nilai defaultnya adalah true
.
Ubah deskripsi
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 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 berikut pada System.Diagnostics.ProcessStartInfo hanya berfungsi ketika ProcessStartInfo.UseShellExecutetrue
:
- ProcessStartInfo.CreateNoWindow
- ProcessStartInfo.ErrorDialog
- ProcessStartInfo.Verb
- ProcessStartInfo.WindowStyle.
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 ProcessStartInfo.UseShellExecute menjadi false
. Anda dapat ikut serta ke jalur yang lebih lambat jika Anda membutuhkannya.
Versi diperkenalkan
2.1
Nota
Dalam versi .NET Core yang lebih lama, UseShellExecute
tidak diimplementasikan untuk Windows.
Tindakan yang direkomendasikan
Jika aplikasi Anda bergantung pada perilaku lama, panggil Process.Start(ProcessStartInfo) dengan UseShellExecute diatur ke true
pada objek ProcessStartInfo.
Kategori
Pustaka .NET inti
API yang terpengaruh
.NET Core 1.0
UnauthorizedAccessException dilemparkan oleh FileSystemInfo.Attributes
Di .NET Core, UnauthorizedAccessException dilemparkan ketika pemanggil mencoba mengatur nilai atribut file tetapi tidak memiliki izin tulis.
Ubah deskripsi
Di .NET Framework, ArgumentException dilemparkan ketika pemanggil mencoba mengatur nilai atribut file di FileSystemInfo.Attributes tetapi tidak memiliki izin tulis. Di .NET Core, UnauthorizedAccessException dilemparkan sebagai gantinya. (Di .NET Core, ArgumentException masih dilemparkan jika pemanggil mencoba mengatur atribut file yang tidak valid.)
Versi yang diperkenalkan
1.0
Tindakan yang direkomendasikan
Ubah pernyataan catch
apa pun untuk menangkap UnauthorizedAccessException, baik sebagai pengganti atau tambahan dari ArgumentException, seperlunya.
Kategori
Pustaka .NET inti
API yang terpengaruh
Penanganan pengecualian pada status yang rusak tidak didukung
Menangani pengecualian untuk kondisi proses yang rusak tidak didukung di .NET Core.
Ubah deskripsi
Sebelumnya, pengecualian status proses yang rusak dapat ditangkap dan ditangani oleh penangan 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 diperkenalkan
1.0
Tindakan yang direkomendasikan
Hindari kebutuhan untuk menangani pengecualian status proses yang rusak dengan terlebih dahulu mengatasi situasi yang menyebabkannya. Jika benar-benar diperlukan untuk menangani pengecualian status proses yang rusak, tulis handler pengecualian dalam kode C atau C++.
Kategori
Pustaka Utama .NET
API yang terpengaruh
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- elemen kebijakan legacyCorruptedStateExceptions
Properti UriBuilder tidak lagi menambahkan karakter utama
UriBuilder.Fragment tidak lagi menambahkan karakter #
terkemuka dan UriBuilder.Query tidak lagi menambahkan karakter ?
terkemuka ketika karakter sudah ada.
Ubah deskripsi
Dalam .NET Framework, properti UriBuilder.Fragment dan UriBuilder.Query selalu menambahkan karakter #
atau ?
, ke nilai yang disimpan. Perilaku ini dapat mengakibatkan beberapa karakter #
atau ?
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
Tindakan yang direkomendasikan
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 perlu menghapus awalan #
atau ?
setiap kali melakukan penambahan.
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
????one=1&two=2&three=3&four=4
. - Di .NET Core, outputnya
?one=1&two=2&three=3&four=4
.
Golongan
Pustaka .NET inti utama
API yang terpengaruh
Process.StartInfo melempar InvalidOperationException untuk proses yang tidak Anda mulai
Membaca properti Process.StartInfo untuk proses yang tidak dimulai oleh kode Anda akan menghasilkan InvalidOperationException.
Ubah deskripsi
Di .NET Framework, mengakses properti Process.StartInfo untuk proses yang tidak dimulai oleh kode Anda akan mengembalikan objek tiruan ProcessStartInfo. Objek dummy berisi nilai default untuk semua propertinya kecuali EnvironmentVariables.
Mulai dari .NET Core 1.0, jika Anda membaca properti Process.StartInfo untuk proses yang tidak Anda mulai (yaitu, dengan memanggil Process.Start), InvalidOperationException dilemparkan.
Versi yang diperkenalkan
1.0
Tindakan yang direkomendasikan
Jangan akses properti Process.StartInfo untuk proses yang tidak dijalankan oleh kode Anda. Misalnya, jangan baca properti ini untuk proses yang dikembalikan oleh Process.GetProcesses.
Kategori
Pustaka .NET inti
API yang terpengaruh
Kriptografi
.NET Core 2.1
Parameter Boolean dari SignedCms.ComputeSignature diperhatikan
Di .NET Core, parameter silent
Boolean dari metode SignedCms.ComputeSignature(CmsSigner, Boolean) dihormati. Perintah PIN tidak ditampilkan jika parameter ini diatur ke true
.
Ubah deskripsi
Dalam .NET Framework, parameter silent
metode SignedCms.ComputeSignature(CmsSigner, Boolean) diabaikan, dan perintah PIN selalu ditampilkan jika diperlukan oleh penyedia. Di .NET Core, parameter silent
dihormati, dan jika diatur ke true
, perintah PIN tidak pernah ditampilkan, bahkan jika diperlukan oleh penyedia.
Dukungan untuk pesan CMS/PKCS #7 diperkenalkan ke .NET Core dalam versi 2.1.
Versi yang diperkenalkan
2.1
Tindakan yang direkomendasikan
Untuk memastikan perintah PIN muncul jika diperlukan, aplikasi desktop harus memanggil SignedCms.ComputeSignature(CmsSigner, Boolean) dan mengatur parameter Boolean ke false
. Perilaku yang dihasilkan sama seperti pada .NET Framework terlepas dari apakah konteks senyap dinonaktifkan di sana.
Kategori
Kriptografi
API yang terpengaruh
MSBuild
.NET Core 3.0
Perubahan nama file manifest sumber daya
Mulai dari .NET Core 3.0, dalam kasus default, MSBuild menghasilkan nama file manifes yang berbeda untuk file sumber daya.
Versi telah diperkenalkan
3.0
Ubah deskripsi
Sebelum .NET Core 3.0, jika tidak ada metadata LogicalName
, ManifestResourceName
, atau DependentUpon
ditentukan untuk item EmbeddedResource
dalam file proyek, MSBuild menghasilkan nama file manifes dalam pola <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
. Jika RootNamespace
tidak ditentukan dalam file proyek, secara otomatis diatur menjadi nama proyek. Misalnya, nama manifes yang dihasilkan untuk file sumber daya bernama Form1.resx di direktori proyek akar MyProject.Form1.resources.
Mulai dari .NET Core 3.0, jika file sumber daya dikolokasikan dengan file sumber dengan nama yang sama (misalnya, Form1.resx dan Form1.cs), MSBuild menggunakan informasi jenis dari file sumber untuk menghasilkan nama file manifes dalam pola <Namespace>.<ClassName>.resources
. Namespace dan nama kelas diekstrak dari tipe pertama yang terletak pada file sumber yang sama. Misalnya, nama manifes yang dihasilkan untuk file sumber daya bernama Form1.resx yang dikolokasikan dengan file sumber bernama Form1.cs adalah MyNamespace.Form1.resources. Hal utama yang perlu diperhatikan adalah bahwa bagian pertama dari nama file berbeda dengan versi .NET Core sebelumnya (myNamespace alih-alih MyProject).
Nota
Jika Anda memiliki metadata LogicalName
, ManifestResourceName
, atau DependentUpon
yang ditentukan pada item EmbeddedResource
dalam file proyek, perubahan ini tidak memengaruhi file sumber daya tersebut.
Perubahan besar ini diperkenalkan dengan menambahkan properti EmbeddedResourceUseDependentUponConvention
ke proyek .NET Core. Secara default, file sumber daya tidak secara eksplisit tercantum dalam file proyek .NET Core, sehingga tidak memiliki metadata EmbeddedResourceUseDependentUponConvention
diatur ke true
, yang merupakan default, MSBuild mencari file sumber yang ditempatkan bersamaan dan mengekstrak namespace dan nama kelas dari file tersebut. Jika Anda mengatur EmbeddedResourceUseDependentUponConvention
ke false
, MSBuild menghasilkan nama manifes sesuai dengan perilaku sebelumnya, yang menggabungkan RootNamespace
dan jalur file relatif.
Tindakan yang direkomendasikan
Dalam kebanyakan kasus, tidak ada tindakan yang diperlukan di bagian pengembang, dan aplikasi Anda harus terus berfungsi. Namun, jika perubahan ini merusak aplikasi, Anda dapat:
Ubah kode Anda untuk mengharapkan nama manifes baru.
Pilih keluar dari konvensi penamaan baru dengan mengatur
EmbeddedResourceUseDependentUponConvention
kefalse
dalam file proyek Anda.<PropertyGroup> <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention> </PropertyGroup>
Kategori
MSBuild
API yang terpengaruh
N/A
Jaringan
.NET Core 2.0
WebClient.CancelAsync tidak selalu membatalkan dengan segera
Mulai dari .NET Core 2.0, memanggil fungsi WebClient.CancelAsync() tidak segera membatalkan permintaan jika respons telah mulai diproses.
Ubah deskripsi
Sebelumnya, memanggil WebClient.CancelAsync() segera membatalkan permintaan. Dimulai pada .NET Core 2.0, memanggil WebClient.CancelAsync() akan segera membatalkan permintaan hanya jika respons belum mulai memproses. Jika pengambilan respons telah dimulai, permintaan dibatalkan hanya setelah respons lengkap telah dibaca.
Perubahan ini diterapkan karena API WebClient tidak digunakan lagi untuk mendukung HttpClient.
Versi yang diperkenalkan
2.0
Tindakan yang direkomendasikan
Gunakan kelas System.Net.Http.HttpClient alih-alih System.Net.WebClient, yang tidak digunakan lagi.
Kategori
Jaringan
API yang terpengaruh
Windows Forms
Dukungan Windows Forms ditambahkan ke .NET Core di versi 3.0. Jika Anda memigrasikan aplikasi Windows Forms dari .NET Framework ke .NET Core, perubahan signifikan yang tercantum di sini mungkin memengaruhi aplikasi Anda.
- Kontrol yang dihapus
- event CellFormatting tidak dipicu jika tooltip ditampilkan
- Control.DefaultFont berubah menjadi Segoe UI 9 pt
- Modernisasi FolderBrowserDialog
- SerializableAttribute dihapus dari beberapa tipe Windows Forms
- sakelar kesesuaian AllowUpdateChildControlIndexForTabControls tidak didukung
- DomainUpDown.UseLegacyScrolling opsi kompatibilitas tidak didukung
- sakelar kompatibilitas DoNotLoadLatestRichEditControl tidak didukung
- DoNotSupportSelectAllShortcutInMultilineTextBox sakelar kompatibilitas tidak didukung
- Pengalih kompatibilitas DontSupportReentrantFilterMessage tidak didukung
- pengaturan kompatibilitas EnableVisualStyleValidation tidak didukung
- kompatibilitas switch UseLegacyContextMenuStripSourceControlValue tidak didukung
- sakelar kompatibilitas UseLegacyImages tidak didukung
- templat Tentang dan Layar Splash rusak untuk Visual Basic
- Jenis di namespace Microsoft.VisualBasic.ApplicationServices tidak tersedia
- Jenis di namespace Microsoft.VisualBasic.Devices tidak tersedia
- Jenis di namespace Microsoft.VisualBasic.MyServices tidak tersedia
.NET Core 3.1
Kontrol yang dihapus
Mulai dari .NET Core 3.1, beberapa kontrol Windows Forms tidak lagi tersedia.
Ubah deskripsi
Dimulai dengan .NET Core 3.1, berbagai kontrol Windows Forms tidak lagi tersedia. Kontrol penggantian yang memiliki desain dan dukungan yang lebih baik diperkenalkan dalam .NET Framework 2.0. Kontrol yang tidak digunakan lagi sebelumnya dihapus dari kotak alat perancang tetapi masih tersedia untuk digunakan.
Jenis berikut ini tidak lagi tersedia:
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGrid.HitTestInfo
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- DataGridColumnStyle.CompModSwitches
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
Versi yang diperkenalkan
3.1
Tindakan yang direkomendasikan
Setiap kontrol yang dihapus memiliki kontrol penggantian yang direkomendasikan. Lihat tabel berikut ini:
Kontrol yang dihapus (API) | Penggantian yang direkomendasikan | API terkait yang dihapus |
---|---|---|
Menu Konteks | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
Menu Utama | MenuStrip | |
Menu | ToolStripDropDown, ToolStripDropDownMenu | KoleksiMenuItem |
Item Menu | ToolStripMenuItem | |
Bilah Alat | ToolStrip | Tampilan Toolbar |
Tombol Bilah Alat | ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Kategori
Windows Forms
API yang terpengaruh
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
Peristiwa CellFormatting tidak dipicu jika tooltip ditampilkan
DataGridView sekarang memperlihatkan teks sel dan tooltip kesalahan ketika di-hover menggunakan mouse dan saat dipilih melalui keyboard. Jika tooltip ditampilkan, peristiwa DataGridView.CellFormatting tidak dipicu.
Ubah deskripsi
Sebelum .NET Core 3.1, DataGridView yang memiliki properti ShowCellToolTips diatur ke true
akan memperlihatkan tooltip untuk teks dan kesalahan pada sel ketika kursor diarahkan ke sel tersebut. Tooltip tidak muncul ketika sel dipilih menggunakan keyboard (misalnya, dengan menggunakan tombol Tab, pintasan keyboard, atau navigasi panah). Jika pengguna mengedit sel, dan kemudian, saat DataGridView masih dalam mode edit, menggerakkan penunjuk mouse ke sel yang tidak memiliki properti ToolTipText, peristiwa CellFormatting diaktifkan untuk memformat teks untuk ditampilkan dalam sel.
Untuk memenuhi standar aksesibilitas, mulai dari .NET Core 3.1, DataGridView yang memiliki properti ShowCellToolTips diatur ke true
menampilkan tooltip untuk teks sel dan kesalahan tidak hanya ketika penunjuk diarahkan ke sel, tetapi juga ketika dipilih menggunakan keyboard. Sebagai konsekuensi dari perubahan ini, peristiwa CellFormattingtidak dinaikkan ketika sel yang tidak memiliki kumpulan properti ToolTipText diarahkan saat DataGridView dalam mode edit. Peristiwa tidak dipicu karena konten sel saat melayang ditampilkan sebagai tooltip alih-alih ditampilkan dalam sel.
Diperkenalkan versi
3.1
Tindakan yang direkomendasikan
Refaktor kode apa pun yang bergantung pada peristiwa CellFormatting saat DataGridView dalam mode edit.
Kategori
Windows Forms
API yang terpengaruh
Tidak
.NET Core 3.0
Font kontrol default diubah menjadi Segoe UI 9 pt
Ubah deskripsi
Di .NET Framework, properti Control.DefaultFont diatur ke Microsoft Sans Serif 8.25 pt
. Gambar berikut menunjukkan jendela yang menggunakan font default.
Mulai dari .NET Core 3.0, font default diatur ke Segoe UI 9 pt
(font yang sama dengan SystemFonts.MessageBoxFont). Akibat perubahan ini, formulir dan kontrol berukuran sekitar 27% lebih besar untuk memperhitungkan ukuran font default baru yang lebih besar. Misalnya:
Perubahan ini dilakukan untuk menyelaraskan dengan panduan pengalaman pengguna (UX) Windows .
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Karena perubahan ukuran formulir dan kontrol, pastikan aplikasi Anda dirender dengan benar.
Untuk mempertahankan font asli untuk satu formulir, atur font defaultnya ke Microsoft Sans Serif 8.25 pt
. Misalnya:
public MyForm()
{
InitializeComponent();
Font = new Font(new FontFamily("Microsoft Sans Serif"), 8.25f);
}
Atau, Anda dapat mengubah font default untuk seluruh aplikasi dengan salah satu cara berikut:
Dengan mengatur properti MSBuild
ApplicationDefaultFont
ke "Microsoft Sans Serif, 8.25pt". Ini adalah teknik yang disukai karena memungkinkan Visual Studio menggunakan pengaturan baru di perancang.<PropertyGroup> <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont> </PropertyGroup>
Dengan memanggil Application.SetDefaultFont(Font).
class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f)); Application.Run(new Form1()); } }
Kategori
- Windows Forms
API yang terpengaruh
Tidak.
Modernisasi pada FolderBrowserDialog
Kontrol FolderBrowserDialog telah berubah dalam aplikasi Windows Forms untuk .NET Core.
Ubah deskripsi
Dalam .NET Framework, formulir Windows menggunakan dialog berikut untuk kontrol FolderBrowserDialog:
Di .NET Core 3.0, Windows Forms menggunakan kontrol berbasis COM yang lebih baru yang diperkenalkan di Windows Vista:
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Dialog akan dimutakhirkan secara otomatis.
Jika Anda ingin mempertahankan dialog asli, atur properti FolderBrowserDialog.AutoUpgradeEnabled ke false
sebelum menampilkan dialog, seperti yang diilustrasikan oleh fragmen kode berikut:
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Kategori
Windows Forms
API yang terpengaruh
SerializableAttribute dihapus dari beberapa jenis Windows Forms
SerializableAttribute telah dihapus dari beberapa kelas Windows Forms yang tidak memiliki skenario serialisasi biner yang diketahui.
Ubah deskripsi
Jenis berikut dihiasi dengan SerializableAttribute di .NET Framework, tetapi atribut telah dihapus di .NET Core:
System.InvariantComparer
- System.ComponentModel.Design.ExceptionCollection
- System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.Design.Serialization.CodeDomComponentSerializationService.CodeDomSerializationStore
- System.Drawing.Design.ToolboxItem
System.Resources.ResXNullRef
System.Resources.ResXDataNode
System.Resources.ResXFileRef
- System.Windows.Forms.Cursor
System.Windows.Forms.NativeMethods.MSOCRINFOSTRUCT
System.Windows.Forms.NativeMethods.MSG
Secara historis, mekanisme serialisasi ini memiliki masalah pemeliharaan dan keamanan yang serius. Mempertahankan SerializableAttribute
pada tipe berarti tipe tersebut harus diuji untuk perubahan serialisasi versi-ke-versi dan kemungkinan perubahan serialisasi antarkerangka kerja. Ini membuatnya lebih sulit untuk mengembangkan jenis-jenis tersebut dan dapat mahal untuk dipertahankan. Jenis-jenis ini tidak memiliki skenario serialisasi biner yang diketahui, yang meminimalkan dampak penghapusan atribut.
Untuk informasi selengkapnya, lihat serialisasi biner.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Perbarui kode apa pun yang mungkin bergantung pada jenis ini yang ditandai sebagai dapat diserialisasikan.
Kategori
Windows Forms
API yang terpengaruh
- Tidak
Pengaturan kompatibilitas AllowUpdateChildControlIndexForTabControls tidak didukung
Sakelar kompatibilitas Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
didukung di Windows Forms pada .NET Framework 4.6 dan versi yang lebih baru, tetapi tidak didukung pada .NET Core atau .NET 5.0 dan yang lebih baru.
Ubah deskripsi
Di .NET Framework 4.6 dan versi yang lebih baru, memilih tab menyusun ulang koleksi kontrolnya. Sakelar kompatibilitas Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
memungkinkan aplikasi untuk menghindari pengurutan ulang ini ketika perilaku tersebut tidak diinginkan.
Pada .NET Core dan .NET 5.0 ke atas, sakelar Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Windows Forms
API yang terpengaruh
- Tidak
Pengaturan kompatibilitas DomainUpDown.UseLegacyScrolling tidak didukung
Sakelar kompatibilitas Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
, yang diperkenalkan dalam .NET Framework 4.7.1, tidak tersedia di Windows Forms pada .NET Core atau .NET 5.0 dan yang lebih baru.
Ubah deskripsi
Dimulai dengan .NET Framework 4.7.1, sakelar kompatibilitas Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
memungkinkan pengembang untuk menolak tindakan DomainUpDown.DownButton() independen dan DomainUpDown.UpButton(). Sakelar memulihkan perilaku lama, di mana DomainUpDown.UpButton() diabaikan jika ada teks konteks, dan pengembang diharuskan menggunakan tindakan DomainUpDown.DownButton() pada kontrol sebelum tindakan DomainUpDown.UpButton(). Untuk informasi selengkapnya, lihat elemen <AppContextSwitchOverrides>.
Di .NET Core dan .NET 5.0 versi selanjutnya, sakelar Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
tidak didukung.
Versi diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsi alternatif yang tersedia.
Kategori
Windows Forms
API yang terpengaruh
Pengalih pengaturan kompatibilitas DoNotLoadLatestRichEditControl tidak didukung
Pengaturan kompatibilitas Switch.System.Windows.Forms.UseLegacyImages
, yang diperkenalkan dalam .NET Framework 4.7.1, tidak didukung di Windows Forms pada .NET Core atau .NET 5.0 dan seterusnya.
Ubah deskripsi
Dalam .NET Framework 4.6.2 dan versi sebelumnya, RichTextBox menginstansiasi kontrol Win32 RichEdit v3.0, dan untuk aplikasi yang menargetkan .NET Framework 4.7.1, kontrol RichTextBox menginstansiasi RichEdit v4.1 (dalam msftedit.dll). Sakelar kompatibilitas Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
diperkenalkan untuk memungkinkan aplikasi yang menargetkan .NET Framework 4.7.1 dan versi yang lebih baru untuk memilih keluar dari kontrol RichEdit v4.1 baru dan menggunakan kontrol RichEdit v3 lama sebagai gantinya.
Di .NET Core dan .NET 5.0 dan versi yang lebih baru, sakelar Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
tidak didukung. Hanya versi baru kontrol RichTextBox yang didukung.
Versi diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsi alternatif yang tersedia.
Kategori
Formulir Windows
API yang terpengaruh
Pengalih kompatibilitas DoNotSupportSelectAllShortcutInMultilineTextBox tidak didukung
Sakelar kompatibilitas Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
, yang diperkenalkan dalam .NET Framework 4.6.1, tidak didukung di Windows Forms pada .NET Core serta .NET 5.0 dan versi-versi yang lebih baru.
Ubah deskripsi
Dimulai dengan .NET Framework 4.6.1, memilih tombol pintasan Ctrl + A dalam kontrol TextBox memilih semua teks. Di .NET Framework 4.6 dan versi sebelumnya, memilih kunci pintasan Ctrl + A gagal memilih semua teks jika Textbox.ShortcutsEnabled dan properti TextBox.Multiline keduanya diatur ke true
. Sakelar kompatibilitas Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
diperkenalkan di .NET Framework 4.6.1 untuk mempertahankan perilaku asli. Untuk informasi selengkapnya, lihat TextBox.ProcessCmdKey.
Di .NET Core dan .NET 5.0 dan versi yang lebih baru, sakelar Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsi alternatif yang tersedia.
Kategori
Formulir Windows
API yang terpengaruh
- Tidak
Sakelar kompatibilitas "DontSupportReentrantFilterMessage" tidak didukung
Sakelar kompatibilitas Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
, yang diperkenalkan dalam .NET Framework 4.6.1, tidak didukung pada Windows Forms di .NET Core, .NET 5.0, dan versi yang lebih baru.
Ubah deskripsi
Dimulai dengan .NET Framework 4.6.1, saklar kompatibilitas Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
mengatasi pengecualian IndexOutOfRangeException yang mungkin terjadi saat pesan Application.FilterMessage dipanggil dengan implementasi IMessageFilter.PreFilterMessage kustom. Untuk informasi selengkapnya, lihat Mitigasi: Implementasi Kustom IMessageFilter.PreFilterMessage.
Di .NET Core dan .NET 5.0 dan yang lebih baru, sakelar Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fitur alternatif yang tersedia.
Kategori
Windows Forms
API yang terpengaruh
Pengalih kompatibilitas EnableVisualStyleValidation tidak berlaku
Sakelar kompatibilitas Switch.System.Windows.Forms.EnableVisualStyleValidation
tidak didukung di Windows Forms pada .NET Core atau .NET 5.0 dan yang lebih baru.
Ubah deskripsi
Dalam .NET Framework, sakelar kompatibilitas Switch.System.Windows.Forms.EnableVisualStyleValidation
memungkinkan aplikasi untuk menolak validasi gaya visual yang disediakan dalam bentuk numerik.
Di .NET Core dan .NET 5.0 dan yang lebih baru, sakelar Switch.System.Windows.Forms.EnableVisualStyleValidation
tidak didukung.
Versi diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsi alternatif yang tersedia.
Kategori
Windows Forms
API yang terpengaruh
- Tidak
Pengaturan kesesuaian opsi UseLegacyContextMenuStripSourceControlValue tidak didukung
Sakelar kompatibilitas Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
, yang diperkenalkan dalam .NET Framework 4.7.2, tidak didukung di Windows Forms pada .NET Core atau .NET 5.0 dan versi yang lebih baru.
Ubah deskripsi
Dimulai dengan .NET Framework 4.7.2, sakelar kompatibilitas Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
memungkinkan pengembang untuk menolak perilaku baru properti ContextMenuStrip.SourceControl, yang sekarang mengembalikan referensi ke kontrol sumber. Perilaku properti sebelumnya adalah mengembalikan null
. Untuk informasi selengkapnya, lihat elemen <AppContextSwitchOverrides>.
Pada .NET Core serta .NET 5.0 dan versi-versi yang lebih baru, sakelar Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
tidak didukung.
Versi diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsi alternatif yang tersedia.
Kategori
Windows Forms
API yang terpengaruh
Sakelar kompatibilitas UseLegacyImages tidak didukung
Pengalih kompatibilitas Switch.System.Windows.Forms.UseLegacyImages
, yang diperkenalkan di .NET Framework 4.8, tidak didukung di Windows Forms pada platform .NET Core, .NET 5.0, atau versi yang lebih baru.
Ubah deskripsi
Dimulai dengan .NET Framework 4.8, sakelar kompatibilitas Switch.System.Windows.Forms.UseLegacyImages
mengatasi kemungkinan masalah penskalaan gambar dalam skenario ClickOnce di lingkungan DPI tinggi. Ketika diatur ke true
, sakelar memungkinkan pengguna untuk mengembalikan penskalakan gambar tradisional pada tampilan DPI tinggi yang skalanya melebihi 100%. Untuk informasi selengkapnya, lihat Catatan Rilis .NET Framework 4.8 di GitHub.
Dalam .NET Core serta .NET 5.0 dan versi yang lebih baru, sakelar Switch.System.Windows.Forms.UseLegacyImages
tidak didukung.
Diperkenalkan versi
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Switch tidak didukung, dan tidak ada opsi lain yang tersedia.
Kategori
Windows Forms
API yang terpengaruh
- Tidak
Templat Tentang dan SplashScreen rusak
File About.vb
dan SplashScreen.vb
yang dihasilkan oleh Visual Studio berisi referensi ke jenis di namespace My
yang tidak tersedia .NET Core 3.0 dan 3.1.
Versi yang diperkenalkan
3.0
Ubah deskripsi
.NET Core 3.0 dan 3.1 tidak berisi dukungan My
Visual Basic penuh. Templat formulir
Tindakan yang direkomendasikan
Dukungan My
Visual Basic ditingkatkan di .NET 5, tingkatkan proyek Anda ke .NET 5 atau yang lebih baru.
-atau-
Perbaiki kesalahan pengkompilasi di jenis Tentang dan jenis SplashScreen di aplikasi Anda. Gunakan kelas System.Reflection.Assembly
untuk mendapatkan informasi yang disediakan oleh jenis My.Application.Info
. Port langsung dari kedua bentuk tersedia di sini.
(assuming the context is advice) Tips
Ini adalah kode sampel dan tidak optimal. Daftar atribut harus di-cache untuk mengurangi waktu pemuatan formulir.
Tentang
Imports System.Reflection
Public NotInheritable Class About
Private Sub about_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Set the title of the form.
Dim applicationTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title
If String.IsNullOrEmpty(applicationTitle) Then
applicationTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
End If
Me.Text = String.Format("About {0}", applicationTitle)
' Initialize all of the text displayed on the About Box.
' TODO: Customize the application's assembly information in the "Application" pane of the project
' properties dialog (under the "Project" menu).
Me.LabelProductName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyProductAttribute)()?.Product, "")
Me.LabelVersion.Text = String.Format("Version {0}", Assembly.GetExecutingAssembly().GetName().Version)
Me.LabelCopyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
Me.LabelCompanyName.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCompanyAttribute)()?.Company, "")
Me.TextBoxDescription.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyDescriptionAttribute)()?.Description, "")
End Sub
Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click
Me.Close()
End Sub
End Class
SplashScreen
Imports System.Reflection
Public NotInheritable Class SplashScreen
Private Sub SplashScreen1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Set up the dialog text at runtime according to the application's assembly information.
'TODO: Customize the application's assembly information in the "Application" pane of the project
' properties dialog (under the "Project" menu).
'Application title
Dim appTitle As String = Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyTitleAttribute)()?.Title
If String.IsNullOrEmpty(appTitle) Then
appTitle = System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().GetName().Name)
End If
ApplicationTitle.Text = appTitle
Dim versionValue = Assembly.GetExecutingAssembly().GetName().Version
'Format the version information using the text set into the Version control at design time as the
' formatting string. This allows for effective localization if desired.
' Build and revision information could be included by using the following code and changing the
' Version control's designtime text to "Version {0}.{1:00}.{2}.{3}" or something similar. See
' String.Format() in Help for more information.
'
' Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor, versionValue.Build, versionValue.Revision)
Version.Text = System.String.Format(Version.Text, versionValue.Major, versionValue.Minor)
'Copyright info
Copyright.Text = If(Assembly.GetExecutingAssembly().GetCustomAttribute(Of AssemblyCopyrightAttribute)()?.Copyright, "")
End Sub
End Class
Kategori
Windows Forms Visual Basic
API yang terpengaruh
Tidak
Jenis di namespace Microsoft.VisualBasic.ApplicationServices tidak tersedia
Tipe di namespace Microsoft.VisualBasic.ApplicationServices tidak tersedia.
Versi yang diperkenalkan
.NET Core 3.0
Ubah deskripsi
Jenis di namespace Microsoft.VisualBasic.ApplicationServices tersedia di .NET Framework. Mereka tidak tersedia di .NET Core 3.0 - 3.1.
Tipe dihapus untuk menghindari ketergantungan perakitan yang tidak perlu atau perubahan besar dalam rilis berikutnya.
Tindakan yang direkomendasikan
Namespace ini ditambahkan di .NET 5, tingkatkan proyek Anda ke .NET 5 atau yang lebih baru.
-atau-
Jika kode Anda bergantung pada penggunaan jenis Microsoft.VisualBasic.ApplicationServices dan anggotanya, Anda mungkin dapat menggunakan jenis atau anggota yang sesuai di pustaka kelas .NET. Misalnya, beberapa anggota System.Environment dan System.Security.Principal.WindowsIdentity menyediakan fungsionalitas yang setara dengan properti kelas Microsoft.VisualBasic.ApplicationServices.User.
Kategori
Visual Basic
API yang terpengaruh
Jenis di namespace Microsoft.VisualBasic.Devices tidak tersedia
Tipe di namespace Microsoft.VisualBasic.Devices tidak tersedia.
Versi yang diperkenalkan
.NET Core 3.0
Ubah deskripsi
Jenis di namespace Microsoft.VisualBasic.Devices tersedia di .NET Framework. Mereka tidak tersedia di .NET Core 3.0 - 3.1.
Jenis dihapus untuk menghindari tergantung pada perakitan yang tidak perlu atau perubahan yang merusak dalam rilis berikutnya.
Tindakan yang direkomendasikan
Namespace ini ditambahkan di .NET 5, tingkatkan proyek Anda ke .NET 5 atau yang lebih baru.
-atau-
Jika kode Anda bergantung pada penggunaan jenis Microsoft.VisualBasic.Devices dan anggotanya, Anda mungkin dapat menggunakan jenis atau anggota yang sesuai di pustaka kelas .NET. Misalnya, fungsionalitas yang setara dengan kelas Microsoft.VisualBasic.Devices.Clock disediakan oleh jenis System.DateTime dan System.Environment, dan fungsionalitas yang setara dengan kelas Microsoft.VisualBasic.Devices.Ports disediakan oleh jenis di namespace System.IO.Ports.
Kategori
Visual Basic
API yang terpengaruh
Jenis di namespace Microsoft.VisualBasic.MyServices tidak tersedia
Tipe di namespace Microsoft.VisualBasic.MyServices tidak tersedia.
Versi diperkenalkan
.NET Core 3.0
Ubah deskripsi
Jenis di namespace Microsoft.VisualBasic.MyServices tersedia di .NET Framework. Mereka tidak tersedia di .NET Core 3.0 - 3.1.
Tipe dihapus untuk menghindari dependensi perakitan yang tidak perlu atau perubahan yang merusak kompatibilitas dalam rilis berikutnya.
Tindakan yang direkomendasikan
Namespace ini ditambahkan di .NET 5, tingkatkan proyek Anda ke .NET 5 atau yang lebih baru.
-atau-
Jika kode Anda bergantung pada penggunaan jenis Microsoft.VisualBasic.MyServices dan anggotanya, ada jenis dan anggota yang sesuai di pustaka kelas .NET. Berikut ini adalah pemetaan tipe Microsoft.VisualBasic.MyServices ke tipe pustaka kelas .NET yang setara:
Tipe Microsoft.VisualBasic.MyServices | Jenis pustaka kelas .NET |
---|---|
ClipboardProxy | System.Windows.Clipboard untuk aplikasi WPF, System.Windows.Forms.Clipboard untuk aplikasi Windows Forms |
FileSystemProxy | Jenis di namespace System.IO |
RegistryProxy | Jenis terkait registri di namespace Microsoft.Win32 |
SpecialDirectoriesProxy | Environment.GetFolderPath |
Kategori
Visual Basic