Melanggar perubahan 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 yang melanggar dikelompokkan menurut kategori, dan dalam kategori tersebut, berdasarkan versi .NET Core tempat mereka diperkenalkan.
Catatan
Artikel ini bukan daftar lengkap perubahan mencolok antara .NET Framework dan .NET Core. Perubahan melanggar yang paling penting ditambahkan di sini saat kita menyadarinya.
Pustaka .NET Inti
- Perubahan nilai default UseShellExecute
- API IDispatchImplAttribute dihapus
- UnauthorizedAccessException 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 dihapus
.NET Core 2.1
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
:
- 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 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.
Tindakan yang direkomendasikan
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
.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
Tindakan yang direkomendasikan
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
Tindakan yang direkomendasikan
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
- System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptionsAttribute
- elemen legacyCorruptedStateExceptionsPolicy
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
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 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
Tindakan yang direkomendasikan
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
Kriptografi
.NET Core 2.1
Parameter Boolean dari SignedCms.ComputeSignature dihormati
Di .NET Core, parameter Boolean silent
dari metode dihormati SignedCms.ComputeSignature(CmsSigner, Boolean) . Perintah PIN tidak ditampilkan jika parameter ini diatur ke true
.
Deskripsi perubahan
Di .NET Framework, silent
parameter SignedCms.ComputeSignature(CmsSigner, Boolean) metode diabaikan, dan perintah PIN selalu ditampilkan jika diperlukan oleh penyedia. Di .NET Core, silent
parameter 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 manifes sumber daya
Mulai dari .NET Core 3.0, dalam kasus default, MSBuild menghasilkan nama file manifes yang berbeda untuk file sumber daya.
Versi yang diperkenalkan
3.0
Deskripsi perubahan
Sebelum .NET Core 3.0, jika tidak ada LogicalName
, , atau DependentUpon
metadata yang ditentukan untuk EmbeddedResource
item dalam file proyek, MSBuild menghasilkan nama file manifes dalam pola <RootNamespace>.<ResourceFilePathFromProjectRoot>.resources
ManifestResourceName
. Jika RootNamespace
tidak didefinisikan dalam file proyek, itu default ke nama proyek. Misalnya, nama manifes yang dihasilkan untuk file sumber daya bernama Form1.resx di direktori proyek akar adalah 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 layanan dan nama kelas diekstrak dari jenis pertama dalam file sumber yang dikolokasi. Misalnya, nama manifes yang dihasilkan untuk file sumber daya bernama Form1.resx yang dikolokasi 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).
Catatan
Jika Anda memiliki LogicalName
metadata , ManifestResourceName
, atau DependentUpon
yang ditentukan pada EmbeddedResource
item dalam file proyek, perubahan ini tidak memengaruhi file sumber daya tersebut.
Perubahan yang melanggar ini diperkenalkan dengan penambahan properti ke EmbeddedResourceUseDependentUponConvention
proyek .NET Core. Secara default, file sumber daya tidak secara eksplisit tercantum dalam file proyek .NET Core, sehingga file tersebut tidak DependentUpon
memiliki metadata untuk menentukan cara menamai file .resources yang dihasilkan. Ketika EmbeddedResourceUseDependentUponConvention
diatur ke true
, yang merupakan default, MSBuild mencari file sumber yang dikolokasi dan mengekstrak namespace layanan 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
T/A
Jaringan
.NET Core 2.0
WebClient.CancelAsync tidak selalu segera membatalkan
Mulai dari .NET Core 2.0, panggilan WebClient.CancelAsync() tidak segera membatalkan permintaan jika respons telah mulai diambil.
Deskripsi perubahan
Sebelumnya, panggilan WebClient.CancelAsync() segera membatalkan permintaan. Mulai dari .NET Core 2.0, panggilan WebClient.CancelAsync() membatalkan permintaan segera hanya jika respons belum mulai mengambil. Jika respons telah mulai diambil, permintaan dibatalkan hanya setelah respons lengkap dibaca.
Perubahan ini diterapkan karena WebClient API tidak digunakan lagi demi HttpClient.
Versi yang diperkenalkan
2.0
Tindakan yang direkomendasikan
System.Net.Http.HttpClient Gunakan kelas alih-alih System.Net.WebClient, yang tidak digunakan lagi.
Kategori
Jaringan
API yang Terpengaruh
Formulir Windows
Formulir Windows dukungan ditambahkan ke .NET Core di versi 3.0. Jika Anda memigrasikan aplikasi Formulir Windows dari .NET Framework ke .NET Core, perubahan melanggar yang tercantum di sini mungkin memengaruhi aplikasi Anda.
- Kontrol yang dihapus
- Peristiwa CellFormatting tidak dimunculkan jika tipsalat ditampilkan
- Control.DefaultFont berubah menjadi Segoe UI 9 pt
- Modernisasi FolderBrowserDialog
- SerializableAttribute dihapus dari beberapa jenis Formulir Windows
- Sakelar kompatibilitas AllowUpdateChildControlIndexForTabControls tidak didukung
- Sakelar kompatibilitas DomainUpDown.UseLegacyScrolling tidak didukung
- Sakelar kompatibilitas DoNotLoadLatestRichEditControl tidak didukung
- Sakelar kompatibilitas DoNotSupportSelectAllShortcutInMultilineTextBox tidak didukung
- Sakelar kompatibilitas DontSupportReentrantFilterMessage tidak didukung
- Sakelar kompatibilitas EnableVisualStyleValidation tidak didukung
- Sakelar kompatibilitas UseLegacyContextMenuStripSourceControlValue tidak didukung
- Sakelar kompatibilitas UseLegacyImages tidak didukung
- Templat Tentang dan SplashScreen 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 Formulir Windows tidak lagi tersedia.
Deskripsi perubahan
Dimulai dengan .NET Core 3.1, berbagai kontrol Formulir Windows 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
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- 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:
Kontrol yang dihapus (API) | Penggantian yang direkomendasikan | API terkait yang dihapus |
---|---|---|
ContextMenu | ContextMenuStrip | |
DataGrid | DataGridView | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
MainMenu | MenuStrip | |
Menu | ToolStripDropDown, ToolStripDropDownMenu | MenuItemCollection |
MenuItem | ToolStripMenuItem | |
ToolBar | ToolStrip | ToolBarAppearance |
ToolBarButton | ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Kategori
Formulir Windows
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 dimunculkan jika tipsalat ditampilkan
Sekarang DataGridView memperlihatkan teks sel dan tipsalat kesalahan saat diarahkan kursor ke mouse dan saat dipilih melalui keyboard. Jika tipsalat ditampilkan, DataGridView.CellFormatting peristiwa tidak dinaikkan.
Deskripsi perubahan
Sebelum .NET Core 3.1, DataGridView properti yang diatur ShowCellToolTips untuk true
memperlihatkan tipsalat untuk teks dan kesalahan sel saat sel diarahkan oleh mouse. Tipsalat tidak ditampilkan saat sel dipilih melalui keyboard (misalnya, dengan menggunakan tombol Tab, tombol pintasan, atau navigasi panah). Jika pengguna mengedit sel, lalu, saat DataGridView masih dalam mode edit, arahkan mouse ke atas sel yang tidak memiliki ToolTipText kumpulan properti, CellFormatting peristiwa dinaikkan untuk memformat teks sel untuk ditampilkan dalam sel.
Untuk memenuhi standar aksesibilitas, mulai dari .NET Core 3.1, DataGridView yang memiliki ShowCellToolTips properti yang diatur untuk true
menampilkan tipsalat untuk teks dan kesalahan sel tidak hanya saat sel diarahkan, tetapi juga saat dipilih melalui keyboard. Sebagai konsekuensi dari perubahan ini, CellFormatting peristiwa tidak dimunculkan ketika sel yang tidak memiliki ToolTipText kumpulan properti diarahkan ke saat DataGridView berada dalam mode edit. Peristiwa tidak dinaikkan karena konten sel yang diarahkan ditampilkan sebagai tipsalat alih-alih ditampilkan dalam sel.
Versi yang diperkenalkan
3.1
Tindakan yang direkomendasikan
Refaktor kode apa pun yang bergantung pada CellFormatting peristiwa saat DataGridView berada dalam mode edit.
Kategori
Formulir Windows
API yang Terpengaruh
Tidak
.NET Core 3.0
Font kontrol default diubah menjadi Segoe UI 9 pt
Deskripsi perubahan
Di .NET Framework, Control.DefaultFont properti 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. Contohnya:
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
. Contohnya:
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
ApplicationDefaultFont
properti MSBuild 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
- Formulir Windows
API yang Terpengaruh
Tidak ada.
Modernisasi FolderBrowserDialog
Kontrol FolderBrowserDialog telah berubah dalam aplikasi Formulir Windows untuk .NET Core.
Deskripsi perubahan
Dalam .NET Framework, formulir Windows menggunakan dialog berikut untuk FolderBrowserDialog kontrol:
Di .NET Core 3.0, Formulir Windows 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 FolderBrowserDialog.AutoUpgradeEnabled properti ke false
sebelum menampilkan dialog, seperti yang diilustrasikan oleh fragmen kode berikut:
var dialog = new FolderBrowserDialog();
dialog.AutoUpgradeEnabled = false;
dialog.ShowDialog();
Kategori
Formulir Windows
API yang Terpengaruh
SerializableAttribute dihapus dari beberapa jenis Formulir Windows
SerializableAttribute telah dihapus dari beberapa kelas Formulir Windows yang tidak memiliki skenario serialisasi biner yang diketahui.
Deskripsi perubahan
Jenis berikut dihiasi dengan SerializableAttribute dalam .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
jenis berarti jenis tersebut harus diuji untuk perubahan serialisasi versi-ke-versi dan kemungkinan perubahan serialisasi kerangka kerja ke kerangka 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
Formulir Windows
API yang Terpengaruh
- Tidak
Sakelar kompatibilitas AllowUpdateChildControlIndexForTabControls tidak didukung
Sakelar Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
kompatibilitas didukung di Formulir Windows pada .NET Framework 4.6 dan versi yang lebih baru tetapi tidak didukung pada .NET Core atau .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Di .NET Framework 4.6 dan versi yang lebih baru, memilih tab menyusun ulang koleksi kontrolnya. Sakelar Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
kompatibilitas memungkinkan aplikasi untuk melewati pengubahan ulang ini ketika perilaku ini tidak diinginkan.
Di .NET Core dan .NET 5.0 dan yang Switch.System.Windows.Forms.AllowUpdateChildControlIndexForTabControls
lebih baru, sakelar tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
- Tidak
Sakelar kompatibilitas DomainUpDown.UseLegacyScrolling tidak didukung
Sakelar Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
kompatibilitas, yang diperkenalkan dalam .NET Framework 4.7.1, tidak didukung di Formulir Windows pada .NET Core atau .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dimulai dengan .NET Framework 4.7.1, Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
sakelar kompatibilitas memungkinkan pengembang untuk menolak independen DomainUpDown.DownButton() dan DomainUpDown.UpButton() tindakan. Sakelar memulihkan perilaku warisan, di mana DomainUpDown.UpButton() diabaikan jika teks konteks ada, dan pengembang diperlukan untuk menggunakan DomainUpDown.DownButton() tindakan pada kontrol sebelum DomainUpDown.UpButton() tindakan. Untuk informasi selengkapnya, lihat <elemen AppContextSwitchOverrides>.
Di .NET Core dan .NET 5.0 dan yang Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling
lebih baru, sakelar tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
Sakelar kompatibilitas DoNotLoadLatestRichEditControl tidak didukung
Sakelar Switch.System.Windows.Forms.UseLegacyImages
kompatibilitas, yang diperkenalkan dalam .NET Framework 4.7.1, tidak didukung di Formulir Windows pada .NET Core atau .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dalam .NET Framework 4.6.2 dan versi sebelumnya, RichTextBox kontrol membuat instans kontrol Win32 RichEdit v3.0, dan untuk aplikasi yang menargetkan .NET Framework 4.7.1, RichTextBox kontrol membuat instans RichEdit v4.1 (dalam msftedit.dll). Sakelar Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl
kompatibilitas 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 yang RichTextBox didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
Sakelar kompatibilitas DoNotSupportSelectAllShortcutInMultilineTextBox tidak didukung
Sakelar Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
kompatibilitas, yang diperkenalkan di .NET Framework 4.6.1, tidak didukung di Formulir Windows pada .NET Core dan .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dimulai dengan .NET Framework 4.6.1, memilih tombol pintasan Ctrl + A dalam TextBox kontrol memilih semua teks. Di .NET Framework 4.6 dan versi sebelumnya, memilih tombol pintasan Ctrl + A gagal memilih semua teks jika Textbox.ShortcutsEnabled dan TextBox.Multiline properti keduanya diatur ke .true
Sakelar Switch.System.Windows.Forms.DoNotSupportSelectAllShortcutInMultilineTextBox
kompatibilitas diperkenalkan dalam .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 fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
- Tidak
Sakelar kompatibilitas DontSupportReentrantFilterMessage tidak didukung
Sakelar Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
kompatibilitas, yang diperkenalkan di .NET Framework 4.6.1, tidak didukung di Formulir Windows pada .NET Core dan .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dimulai dengan .NET Framework 4.6.1, Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
sakelar kompatibilitas menangani kemungkinan IndexOutOfRangeException pengecualian ketika pesan dipanggil Application.FilterMessage dengan implementasi kustom IMessageFilter.PreFilterMessage . Untuk informasi selengkapnya, lihat Mitigasi: Implementasi IMessageFilter.PreFilterMessage Kustom.
Di .NET Core dan .NET 5.0 dan yang Switch.System.Windows.Forms.DontSupportReentrantFilterMessage
lebih baru, sakelar tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
Sakelar kompatibilitas EnableVisualStyleValidation tidak didukung
Sakelar Switch.System.Windows.Forms.EnableVisualStyleValidation
kompatibilitas tidak didukung di Formulir Windows pada .NET Core atau .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dalam .NET Framework, Switch.System.Windows.Forms.EnableVisualStyleValidation
sakelar kompatibilitas memungkinkan aplikasi untuk menolak validasi gaya visual yang disediakan dalam bentuk numerik.
Di .NET Core dan .NET 5.0 dan yang Switch.System.Windows.Forms.EnableVisualStyleValidation
lebih baru, sakelar tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
- Tidak
Sakelar kompatibilitas UseLegacyContextMenuStripSourceControlValue tidak didukung
Sakelar Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
kompatibilitas, yang diperkenalkan di .NET Framework 4.7.2, tidak didukung di Formulir Windows pada .NET Core atau .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dimulai dengan .NET Framework 4.7.2, Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
sakelar kompatibilitas memungkinkan pengembang untuk menolak perilaku ContextMenuStrip.SourceControl baru properti, yang sekarang mengembalikan referensi ke kontrol sumber. Perilaku properti sebelumnya adalah mengembalikan null
. Untuk informasi selengkapnya, lihat <elemen AppContextSwitchOverrides>.
Di .NET Core dan .NET 5.0 dan yang Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue
lebih baru, sakelar tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
API yang Terpengaruh
Sakelar kompatibilitas UseLegacyImages tidak didukung
Sakelar Switch.System.Windows.Forms.UseLegacyImages
kompatibilitas, yang diperkenalkan di .NET Framework 4.8, tidak didukung di Formulir Windows pada .NET Core atau .NET 5.0 dan yang lebih baru.
Deskripsi perubahan
Dimulai dengan .NET Framework 4.8, Switch.System.Windows.Forms.UseLegacyImages
sakelar kompatibilitas mengatasi kemungkinan masalah penskalaan gambar dalam skenario ClickOnce di lingkungan DPI tinggi. Ketika diatur ke true
, sakelar memungkinkan pengguna untuk memulihkan penskalakan gambar warisan pada tampilan DPI tinggi yang skalanya diatur ke lebih besar dari 100%. Untuk informasi selengkapnya, lihat Catatan Rilis .NET Framework 4.8 di GitHub.
Di .NET Core dan .NET 5.0 dan yang Switch.System.Windows.Forms.UseLegacyImages
lebih baru, sakelar tidak didukung.
Versi yang diperkenalkan
3.0
Tindakan yang direkomendasikan
Hapus sakelar. Sakelar tidak didukung, dan tidak ada fungsionalitas alternatif yang tersedia.
Kategori
Formulir Windows
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 My
namespace layanan yang tidak tersedia .NET Core 3.0 dan 3.1.
Versi yang diperkenalkan
3.0
Deskripsi perubahan
.NET Core 3.0 dan 3.1 tidak berisi dukungan Visual Basic My
penuh. Templat formulir Tentang dan SplashScreen di Visual Studio untuk Visual Basic Formulir Windows properti referensi aplikasi dalam My.Application.Info
jenis yang tidak tersedia.
Tindakan yang direkomendasikan
Dukungan Visual Basic My
ditingkatkan di .NET 5, tingkatkan proyek Anda ke .NET 5 atau yang lebih baru.
-atau-
Perbaiki kesalahan pengkompilasi di jenis Tentang dan SplashScreen di aplikasi Anda. System.Reflection.Assembly
Gunakan kelas untuk mendapatkan informasi yang disediakan oleh jenis .My.Application.Info
Port lurus dari kedua bentuk tersedia di sini.
Tip
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
Formulir Windows Visual Basic
API yang Terpengaruh
Tidak
Jenis di namespace Microsoft.VisualBasic.ApplicationServices tidak tersedia
Tipe di Microsoft.VisualBasic.ApplicationServices namespace tidak tersedia.
Versi yang diperkenalkan
.NET Core 3.0
Deskripsi perubahan
Jenis di Microsoft.VisualBasic.ApplicationServices namespace tersedia di .NET Framework. Mereka tidak tersedia di .NET Core 3.0 - 3.1.
Jenis dihapus untuk menghindari dependensi perakitan yang tidak perlu atau melanggar perubahan 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 System.Environment dan System.Security.Principal.WindowsIdentity anggota menyediakan fungsionalitas yang setara dengan properti Microsoft.VisualBasic.ApplicationServices.User kelas.
Kategori
Visual Basic
API yang Terpengaruh
Jenis di namespace Microsoft.VisualBasic.Devices tidak tersedia
Tipe di Microsoft.VisualBasic.Devices namespace tidak tersedia.
Versi yang diperkenalkan
.NET Core 3.0
Deskripsi perubahan
Jenis di Microsoft.VisualBasic.Devices namespace tersedia di .NET Framework. Mereka tidak tersedia di .NET Core 3.0 - 3.1.
Jenis dihapus untuk menghindari dependensi perakitan yang tidak perlu atau melanggar perubahan 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 Microsoft.VisualBasic.Devices.Clock kelas disediakan oleh System.DateTime jenis dan System.Environment , dan fungsionalitas yang setara dengan Microsoft.VisualBasic.Devices.Ports kelas disediakan oleh jenis di System.IO.Ports namespace layanan.
Kategori
Visual Basic
API yang Terpengaruh
Jenis di namespace Microsoft.VisualBasic.MyServices tidak tersedia
Tipe di Microsoft.VisualBasic.MyServices namespace tidak tersedia.
Versi yang diperkenalkan
.NET Core 3.0
Deskripsi perubahan
Jenis di Microsoft.VisualBasic.MyServices namespace tersedia di .NET Framework. Mereka tidak tersedia di .NET Core 3.0 - 3.1.
Jenis dihapus untuk menghindari dependensi perakitan yang tidak perlu atau melanggar perubahan 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 jenis Microsoft.VisualBasic.MyServices ke jenis pustaka kelas .NET yang setara:
Jenis Microsoft.VisualBasic.MyServices | Jenis pustaka kelas .NET |
---|---|
ClipboardProxy | System.Windows.Clipboarduntuk aplikasi WPF, System.Windows.Forms.Clipboard untuk aplikasi Formulir Windows |
FileSystemProxy | Jenis di System.IO namespace layanan |
RegistryProxy | Jenis terkait registri di Microsoft.Win32 namespace layanan |
SpecialDirectoriesProxy | Environment.GetFolderPath |
Kategori
Visual Basic