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.Commoncontinuerà a evolversi solo nel contesto di Windows Forms e GDI+.

Per usare queste API per le app multipiattaforma, eseguire la migrazione a una delle librerie seguenti:

In alternativa, è possibile abilitare il supporto per le piattaforme non Windows in .NET 6 impostando l'System.Drawing.EnableUnixSupportopzione 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:

Spazio dei nomi System.Drawing.Drawing2D:

Spazio dei nomi System.Drawing.Imaging:

Spazio dei nomi System.Drawing.Printing:

Spazio dei nomi System.Drawing.Text:

Vedi anche