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, pangoen 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+.

Als u deze API's voor platformoverschrijdende apps wilt gebruiken, migreert u naar een van de volgende bibliotheken:

U kunt ook ondersteuning inschakelen voor niet-Windows-platforms in .NET 6 door de System.Drawing.EnableUnixSupportruntimeconfiguratieswitch true in te stellen in 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:

System.Drawing.Drawing2D Naamruimte:

System.Drawing.Imaging Naamruimte:

System.Drawing.Printing Naamruimte:

System.Drawing.Text Naamruimte:

Zie ook