System.Drawing.Common wordt alleen ondersteund in Windows
Het NuGet-pakket System.Drawing.Common wordt nu toegeschreven aan een Windows-specifieke bibliotheek. De platformanalyse verzendt waarschuwingen tijdens het compileren bij het compileren van niet-Windows-besturingssystemen.
Op niet-Windows-besturingssystemen, tenzij u een runtimeconfiguratieswitch instelt, wordt er een TypeInitializationException uitzondering gegenereerd met PlatformNotSupportedException als interne uitzondering.
Oud gedrag
Vóór .NET 6 heeft het pakket System.Drawing.Common geen compileertijdwaarschuwingen geproduceerd en zijn er geen runtime-uitzonderingen gegenereerd.
Nieuw gedrag
Vanaf .NET 6 verzendt de platformanalyse compilatietijdwaarschuwingen wanneer de verwijzingscode wordt gecompileerd voor niet-Windows-besturingssystemen. Bovendien wordt de volgende runtime-uitzondering gegenereerd, tenzij u een configuratieoptie instelt:
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()
Versie geïntroduceerd
.NET 6
Type wijziging die fouten veroorzaken
Deze wijziging kan van invloed zijn op de broncompatibiliteit en binaire compatibiliteit.
Reden voor wijziging
Omdat System.Drawing.Common
het is ontworpen om een dunne wrapper te zijn voor Windows-technologieën, is de platformoverschrijdende implementatie subparante.
libgdiplus
is de belangrijkste provider van de platformoverschrijdende implementatie van System.Drawing.Common
aan de systeemeigen kant. libgdiplus
is effectief een herplementatie van de onderdelen van Windows waarvan System.Drawing.Common
afhankelijk is. Deze implementatie maakt libgdiplus
een niet-triviaal onderdeel. Het is ongeveer 30.000 regels C-code die grotendeels niet is getest en er ontbreekt veel functionaliteit. libgdiplus
heeft ook talloze externe afhankelijkheden voor het verwerken van afbeeldingen en het weergeven van tekst, zoals cairo
, pango
en andere systeemeigen bibliotheken. Deze afhankelijkheden maken het onderhouden en verzenden van het onderdeel nog moeilijker. Sinds de integratie van de mono-platformoverschrijdende implementatie, hebben we talloze problemen omgeleid naar libgdiplus
die nooit opgelost. Ter vergelijking zijn andere externe afhankelijkheden die we hebben genomen, zoals icu
of openssl
, bibliotheken van hoge kwaliteit. Het is niet haalbaar om naar het punt te komen libgdiplus
waar de functieset en kwaliteit gelijk zijn aan de rest van de .NET-stack.
Uit analyse van NuGet-pakketten hebben we vastgesteld dat System.Drawing.Common
er platformoverschrijdend wordt gebruikt voor het bewerken van afbeeldingen, zoals QR-codegeneratoren en tekstweergave. We hebben het zware grafische gebruik niet opgemerkt, omdat onze platformoverschrijdende grafische ondersteuning onvolledig is. Het gebruik dat we zien System.Drawing.Common
in niet-Windows-omgevingen worden doorgaans goed ondersteund met SkiaSharp en ImageSharp.
System.Drawing.Common
blijft zich alleen ontwikkelen in de context van Windows Forms en GDI+.
Aanbevolen actie
Als u deze API's voor platformoverschrijdende apps wilt gebruiken, migreert u naar een van de volgende bibliotheken:
- SkiaSharp
- ImageSharp (gelaagde licentie)
- Aspose.Drawing (commerciële licentie)
- Microsoft.Maui.Graphics
U kunt ook ondersteuning inschakelen voor niet-Windows-platforms in .NET 6 door de System.Drawing.EnableUnixSupport
runtimeconfiguratieswitch true
in te stellen op het runtimeconfig.json-bestand.
runtimeconfig.template.json sjabloonbestand:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
[appname].runtimeconfig.json uitvoerbestand:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
Notitie
- Deze configuratieswitch is toegevoegd om platformoverschrijdende apps te bieden die sterk afhankelijk zijn van deze pakkettijd om te migreren naar modernere bibliotheken. Niet-Windows-fouten worden echter niet opgelost.
- Deze switch is alleen beschikbaar in .NET 6 en is verwijderd in .NET 7. Zie System.Drawing.Common config switch verwijderd voor meer informatie.
Betrokken API's
System.Drawing naamruimte:
- 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 naamruimte:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging naamruimte:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing naamruimte:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text naamruimte: