System.Drawing.Common yalnızca Windows'ta desteklenir

System.Drawing.Common NuGet paketi artık Windows'a özgü bir kitaplık olarak özniteliklendirilir. Platform çözümleyicisi, Windows dışı işletim sistemleri için derleme yaparken derleme zamanında uyarı yayar.

Windows dışı işletim sistemlerinde, çalışma zamanı yapılandırma anahtarı ayarlamadığınız sürece, iç özel durum olarak ile PlatformNotSupportedException bir TypeInitializationException özel durum oluşturulur.

Eski davranış

.NET 6'dan önce System.Drawing.Common paketinin kullanılması derleme zamanı uyarısı üretmedi ve hiçbir çalışma zamanı özel durumu oluşturmadı.

Yeni davranış

.NET 6'dan başlayarak platform çözümleyicisi, Windows dışı işletim sistemleri için koda başvururken derleme zamanı uyarıları yayar. Ayrıca, bir yapılandırma seçeneği ayarlamadığınız sürece aşağıdaki çalışma zamanı özel durumu oluşturulur:

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()

Sürüm kullanıma sunulmuştur

.NET 6

Hataya neden olan değişikliğin türü

Bu değişiklik kaynak uyumluluğunu ve ikili uyumluluğu etkileyebilir.

Değişiklik nedeni

System.Drawing.Common Windows teknolojileri üzerinde ince bir sarmalayıcı olacak şekilde tasarlandığından, platformlar arası uygulaması alt öğedir.

libgdiplus , yerel tarafta platformlar arası uygulamasının System.Drawing.Common ana sağlayıcısıdır. libgdiplus , Windows'un System.Drawing.Common bağlı olan bölümlerinin etkili bir şekilde yeniden bir şekilde yeniden bir araya getirilmesidir. Bu uygulama önemsiz bir bileşen oluşturur libgdiplus . Büyük ölçüde test edilmemiş yaklaşık 30.000 satır C kodu vardır ve çok fazla işleve sahip değil. libgdiplusayrıca görüntü işleme ve metin işleme için , pangove diğer yerel kitaplıklar gibi cairoçok sayıda dış bağımlılığı vardır. Bu bağımlılıklar, bileşenin bakımını ve gönderimini daha da zor hale getirir. Mono platformlar arası uygulamanın dahil edilmesinden bu yana, düzeltilmeyen birçok sorunu libgdiplus yeniden yönlendirdik. Buna karşılık, aldığımız veya opensslgibi icu diğer dış bağımlılıklar yüksek kaliteli kitaplıklardır. Özellik kümesinin ve kalitesinin .NET yığınının geri kalanıyla aynı olduğu noktaya ulaşmak libgdiplus uygun değildir.

NuGet paketlerinin analizinden, QR kod oluşturucuları ve metin işleme gibi görüntü işleme için çoğunlukla platformlar arası kullanıldığını gözlemledik System.Drawing.Common . Platformlar arası grafik desteğimiz eksik olduğundan yoğun grafik kullanımı fark etmedik. Windows dışı ortamlarda gördüğümüz System.Drawing.Common kullanımlar genellikle SkiaSharp ve ImageSharp ile iyi desteklenir.

System.Drawing.Common yalnızca Windows Forms ve GDI+ bağlamında gelişmeye devam edecektir.

Platformlar arası uygulamalarda bu API'leri kullanmak için aşağıdaki kitaplıklardan birine geçin:

Alternatif olarak, runtimeconfig.json dosyasında çalışma zamanı yapılandırma anahtarını true olarak ayarlayarak System.Drawing.EnableUnixSupport .NET 6'da Windows dışı platformlar için desteği etkinleştirebilirsiniz.

şablon dosyasını runtimeconfig.template.json:

{
   "configProperties": {
      "System.Drawing.EnableUnixSupport": true
   }
}

[appname].runtimeconfig.json çıktı dosyası:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
   }
}

Not

  • Bu yapılandırma anahtarı, daha modern kitaplıklara geçiş yapmak için bu paket süresine büyük ölçüde bağımlı olan platformlar arası uygulamalara izin vermek için eklendi. Ancak, Windows dışı hatalar düzeltilmeyecektir.
  • Bu anahtar yalnızca .NET 6'da kullanılabilir ve .NET 7'de kaldırılmıştır. Daha fazla bilgi için bkz . System.Drawing.Common yapılandırma anahtarı kaldırıldı.

Etkilenen API’ler

System.Drawing ad alanı:

System.Drawing.Drawing2D ad alanı:

System.Drawing.Imaging ad alanı:

System.Drawing.Printing ad alanı:

System.Drawing.Text ad alanı:

Ayrıca bkz.