System.Drawing.Common hanya didukung di Windows
Paket System.Drawing.Common NuGet sekarang dikaitkan sebagai pustaka khusus Windows. Penganalisis platform memunculkan peringatan pada waktu kompilasi saat mengkompilasi untuk sistem operasi non-Windows.
Pada sistem operasi non-Windows, kecuali Anda mengatur sakelar konfigurasi runtime, TypeInitializationException pengecualian dilemparkan sebagai PlatformNotSupportedException pengecualian dalam.
Perilaku yang lama
Sebelum .NET 6, menggunakan paket System.Drawing.Common tidak menghasilkan peringatan waktu kompilasi, dan tidak ada pengecualian run-time yang dilemparkan.
Perilaku yang baru
Mulai dari .NET 6, penganalisis platform memancarkan peringatan waktu kompilasi saat mereferensikan kode dikompilasi untuk sistem operasi non-Windows. Selain itu, pengecualian run-time berikut dilemparkan kecuali Anda mengatur opsi konfigurasi:
System.TypeInitializationException : The type initializer for 'Gdip' threw an exception.
---- System.PlatformNotSupportedException : System.Drawing.Common is not supported on non-Windows platforms. See https://aka.ms/systemdrawingnonwindows for more information.
Stack Trace:
at System.Drawing.SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(String filename, IntPtr& bitmap)
/_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(42,0): at System.Drawing.Bitmap..ctor(String filename, Boolean useIcm)
/_/src/libraries/System.Drawing.Common/src/System/Drawing/Bitmap.cs(25,0): at System.Drawing.Bitmap..ctor(String filename)
/_/src/libraries/System.Resources.ResourceManager/tests/ResourceManagerTests.cs(270,0): at System.Resources.Tests.ResourceManagerTests.EnglishImageResourceData()+MoveNext()
/_/src/libraries/System.Linq/src/System/Linq/Select.cs(136,0): at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
----- Inner Stack Trace -----
/_/src/libraries/System.Drawing.Common/src/System/Drawing/LibraryResolver.cs(31,0): at System.Drawing.LibraryResolver.EnsureRegistered()
/_/src/libraries/System.Drawing.Common/src/System/Drawing/GdiplusNative.Unix.cs(65,0): at System.Drawing.SafeNativeMethods.Gdip.PlatformInitialize()
/_/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs(27,0): at System.Drawing.SafeNativeMethods.Gdip..cctor()
Versi yang diperkenalkan
.NET 6
Jenis perubahan yang melanggar
Perubahan ini dapat memengaruhi kompatibilitas sumber dan kompatibilitas biner.
Alasan untuk berubah
Karena System.Drawing.Common
dirancang untuk menjadi pembungkus tipis atas teknologi Windows, implementasi lintas platformnya adalah subpar.
libgdiplus
adalah penyedia utama implementasi lintas platform dari System.Drawing.Common
sisi asli. libgdiplus
secara efektif merupakan pelengkap dari bagian-bagian Windows yang System.Drawing.Common
bergantung pada. Implementasi tersebut membuat libgdiplus
komponen yang tidak sepele. Ini sekitar 30.000 baris kode C yang sebagian besar belum dites, dan tidak memiliki banyak fungsionalitas. libgdiplus
juga memiliki banyak dependensi eksternal untuk pemrosesan gambar dan penyajian teks, seperti cairo
, pango
, dan pustaka asli lainnya. Dependensi tersebut membuat pemeliharaan dan pengiriman komponen menjadi lebih menantang. Sejak dimasukkannya implementasi lintas platform Mono, kami telah mengalihkan banyak masalah ke libgdiplus
yang tidak pernah diperbaiki. Sebagai perbandingan, dependensi eksternal lain yang telah kami ambil, seperti icu
atau openssl
, adalah pustaka berkualitas tinggi. Tidak layak untuk sampai libgdiplus
ke titik di mana set fitur dan kualitasnya sejajar dengan sisa tumpukan .NET.
Dari analisis paket NuGet, kami telah mengamati bahwa System.Drawing.Common
sebagian besar digunakan lintas platform untuk manipulasi gambar, seperti generator kode QR dan penyajian teks. Kami belum melihat penggunaan grafis yang berat, karena dukungan grafis lintas platform kami tidak lengkap. Penggunaan yang kita lihat System.Drawing.Common
di lingkungan non-Windows biasanya didukung dengan baik dengan SkiaSharp dan ImageSharp.
System.Drawing.Common
akan terus berkembang hanya dalam konteks Formulir Windows dan GDI+.
Tindakan yang direkomendasikan
Untuk menggunakan API ini untuk aplikasi lintas platform, migrasikan ke salah satu pustaka berikut:
- SkiaSharp
- ImageSharp (lisensi berjenjang)
- Aspose.Drawing (lisensi komersial)
- Microsoft.Maui.Graphics
Atau, Anda dapat mengaktifkan dukungan untuk platform non-Windows di .NET 6 dengan mengatur System.Drawing.EnableUnixSupport
sakelar konfigurasi runtime ke true
dalam file runtimeconfig.json .
runtimeconfig.template.json file templat:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
[appname].runtimeconfig.json file output:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
Catatan
- Sakelar konfigurasi ini ditambahkan untuk memberikan aplikasi lintas platform yang sangat bergantung pada waktu paket ini untuk bermigrasi ke pustaka yang lebih modern. Namun, bug non-Windows tidak akan diperbaiki.
- Sakelar ini hanya tersedia di .NET 6 dan dihapus di .NET 7. Untuk informasi selengkapnya, lihat Sakelar konfigurasi System.Drawing.Common dihapus.
API yang Terpengaruh
System.Drawing Namespace:
- Bitmap
- Brush
- Brushes
- BufferedGraphics
- BufferedGraphicsContext
- Font
- FontFamily
- FontConverter
- Graphics
- Icon
- IconConverter
- Image
- ImageAnimator
- Pen
- Pens
- Region
- SolidBrush
- StringFormat
- SystemBrushes
- SystemFonts
- SystemIcons
- SystemPens
- TextureBrush
System.Drawing.Drawing2D Namespace:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging Namespace:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing Namespace:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text Namespace:
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk