System.Drawing.Common è supportato solo in Windows
Il pacchetto NuGet System.Drawing.Common è ora attribuito come libreria specifica di Windows. L'analizzatore della piattaforma genera un avviso in fase di compilazione durante la compilazione per sistemi operativi non Windows.
Nei sistemi operativi non Windows, a meno che non si imposti un commutatore di configurazione di runtime, viene generata un'eccezione TypeInitializationException con PlatformNotSupportedException come eccezione interna.
Comportamento precedente
Prima di .NET 6, l'uso del pacchetto System.Drawing.Common non generava avvisi in fase di compilazione e non venivano generate eccezioni in fase di esecuzione.
Nuovo comportamento
A partire da .NET 6, l'analizzatore della piattaforma genera avvisi in fase di compilazione quando viene compilato il codice di riferimento per sistemi operativi non Windows. Viene inoltre generata l'eccezione di runtime seguente, a meno che non si imposti un'opzione di configurazione:
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()
Versione introdotta
.NET 6
Tipo di modifica che causa un'interruzione
Questa modifica può influire sulla compatibilità dell'origine e sulla compatibilità binaria.
Motivo della modifica
Poiché System.Drawing.Common
è stato progettato per essere un thin wrapper sulle tecnologie Windows, l'implementazione multipiattaforma offre prestazioni sotto la media.
libgdiplus
è il provider principale dell'implementazione multipiattaforma di System.Drawing.Common
sul lato nativo. libgdiplus
è in effetti una re-implementazione delle parti di Windows da cui dipende System.Drawing.Common
. Questa implementazione rende libgdiplus
un componente non banale. Si tratta di circa 30.000 righe di codice C in gran parte non testato a cui mancano molte funzionalità. libgdiplus
presenta anche numerose dipendenze esterne per l'elaborazione delle immagini e il rendering del testo, ad esempio cairo
, pango
e altre librerie native. Queste dipendenze rendono la gestione e il recapito del componente ancora più impegnativi. Dall'inclusione dell'implementazione multipiattaforma Mono, a libgdiplus
sono stati reindirizzati numerosi problemi che non sono mai stati risolti. In confronto, altre dipendenze esterne esaminate, ad esempio icu
o openssl
, sono librerie di alta qualità. Non è possibile far raggiungere a libgdiplus
il punto in cui il set di funzionalità e la qualità sono alla pari con il resto dello stack .NET.
Dall'analisi dei pacchetti NuGet, è stato osservato che l'utilizzo di System.Drawing.Common
multipiattaforma serve principalmente alla modifica delle immagini, ad esempio generatori di codice a matrice e rendering del testo. Non è stato rilevato un utilizzo elevato della grafica, perché il supporto della grafica multipiattaforma è incompleto. Gli utilizzi di System.Drawing.Common
osservati in ambienti non Windows sono in genere ben supportati con SkiaSharp e ImageSharp.
System.Drawing.Common
continuerà a evolversi solo nel contesto di Windows Forms e GDI+.
Azione consigliata
Per usare queste API per le app multipiattaforma, eseguire la migrazione a una delle librerie seguenti:
- SkiaSharp
- ImageSharp (licenza a livelli)
- Aspose.Drawing (licenza commerciale)
- Microsoft.Maui.Graphics
In alternativa, è possibile abilitare il supporto per le piattaforme non Windows in .NET 6 impostando System.Drawing.EnableUnixSupport
l'opzione di configurazione di runtime su true
nel file runtimeconfig.json.
File modello runtimeconfig.template.json:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
File di output [appname].runtimeconfig.json:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
Nota
- Questa opzione di configurazione è stata aggiunta per lasciare alle app multipiattaforma che dipendono pesantemente da questo pacchetto il tempo di eseguire la migrazione a librerie più moderne. Tuttavia, i bug non Windows non verranno corretti.
- Questa opzione è disponibile solo in .NET 6 ed è stata rimossa in .NET 7. Per altre informazioni, vedere Opzione di configurazione System.Drawing.Common rimossa.
API interessate
Spazio dei nomi System.Drawing:
- Bitmap
- Brush
- Brushes
- BufferedGraphics
- BufferedGraphicsContext
- Font
- FontFamily
- FontConverter
- Graphics
- Icon
- IconConverter
- Image
- ImageAnimator
- Pen
- Pens
- Region
- SolidBrush
- StringFormat
- SystemBrushes
- SystemFonts
- SystemIcons
- SystemPens
- TextureBrush
Spazio dei nomi System.Drawing.Drawing2D:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
Spazio dei nomi System.Drawing.Imaging:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
Spazio dei nomi System.Drawing.Printing:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
Spazio dei nomi System.Drawing.Text: