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.Commonakan terus berkembang hanya dalam konteks Formulir Windows dan GDI+.

Untuk menggunakan API ini untuk aplikasi lintas platform, migrasikan ke salah satu pustaka berikut:

Atau, Anda dapat mengaktifkan dukungan untuk platform non-Windows di .NET 6 dengan mengatur System.Drawing.EnableUnixSupportsakelar 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:

System.Drawing.Drawing2D Namespace:

System.Drawing.Imaging Namespace:

System.Drawing.Printing Namespace:

System.Drawing.Text Namespace:

Lihat juga