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. libgdiplus
ayrıca görüntü işleme ve metin işleme için , pango
ve 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 openssl
gibi 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.
Önerilen eylem
Platformlar arası uygulamalarda bu API'leri kullanmak için aşağıdaki kitaplıklardan birine geçin:
- SkiaSharp
- ImageSharp (katmanlı lisans)
- Aspose.Drawing (ticari lisans)
- Microsoft.Maui.Graphics
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ı:
- 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 ad alanı:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging ad alanı:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing ad alanı:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text ad alanı: