A System.Drawing.Common csak Windows rendszeren támogatott

A System.Drawing.Common NuGet-csomag mostantól Windows-specifikus kódtárként van rendelve. A platformelemző figyelmeztetést ad ki fordításkor a nem Windows rendszerű operációs rendszerek összeállításakor.

Nem Windows operációs rendszereken, hacsak nem állít be futtatókörnyezeti konfigurációs kapcsolót, TypeInitializationException a rendszer kivételt képez PlatformNotSupportedException a belső kivételként.

Régi viselkedés

A .NET 6 előtt a System.Drawing.Common csomag használata nem eredményezett fordítási időt jelző figyelmeztetést, és nem történt futásidejű kivétel.

Új viselkedés

A .NET 6-tól kezdve a platformelemző fordítási időt jelző figyelmeztetéseket ad ki, amikor a nem Windows operációs rendszerekre vonatkozó hivatkozási kódot fordít le. Emellett a rendszer a következő futásidejű kivételt is kiveheti, kivéve, ha beállít egy konfigurációs beállítást:

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()

Bevezetett verzió

.NET 6

A kompatibilitástörő változás típusa

Ez a módosítás hatással lehet a forráskompatibilitásra és a bináris kompatibilitásra.

A változás oka

Mivel System.Drawing.Common úgy tervezték, hogy vékony burkoló a Windows-technológiák, annak platformfüggetlen implementációja alpar.

libgdiplus a natív oldal platformfüggetlen megvalósításának System.Drawing.Common fő szolgáltatója. libgdiplus gyakorlatilag a Windows azon részeinek újratelepítése, amelyektől System.Drawing.Common függenek. Ez a megvalósítás nem triviális összetevőt hoz létre libgdiplus . Ez körülbelül 30 000 sornyi C-kód, amely nagyrészt nem tesztelt, és sok funkciót nem tartalmaz. libgdiplus emellett számos külső függősége van a képfeldolgozáshoz és a szövegmegjelenítéshez, például cairoa , pangoés más natív kódtárakhoz. Ezek a függőségek még nehezebbé teszik az összetevő karbantartását és szállítását. A Mono platformfüggetlen implementációjának bevezetése óta számos olyan problémát libgdiplus átirányítottunk, amelyek soha nem lettek javítva. Ehhez képest az egyéb külső függőségek, például icu a vagy openssl, kiváló minőségű kódtárak. Nem járható út ahhoz a ponthoz, libgdiplus ahol a szolgáltatáskészlet és a minőség a .NET-verem többi részével egyenlõ.

A NuGet-csomagok elemzése során megfigyeltük, hogy System.Drawing.Common a platformfüggetlen elemeket többnyire képmanipulációra használják, például QR-kódgenerátorokhoz és szövegmegjelenítésekhez. Nem vettük észre a nagy grafikai használatot, mivel a platformfüggetlen grafikus támogatásunk hiányos. A nem Windows-környezetekben látható System.Drawing.Common használatok általában jól támogatottak a SkiaSharp és az ImageSharp használatával.

System.Drawing.Common továbbra is csak a Windows Forms és a GDI+ környezetben fejlődik tovább.

Ha platformfüggetlen alkalmazásokhoz szeretné használni ezeket az API-kat, migráljon az alábbi kódtárak egyikére:

Másik lehetőségként engedélyezheti a nem Windows rendszerű platformok támogatását a .NET 6-ban úgy, hogy true a System.Drawing.EnableUnixSupportfuttatókörnyezet konfigurációs kapcsolóját a runtimeconfig.json fájlba állítja.

runtimeconfig.template.json sablonfájl:

{
   "configProperties": {
      "System.Drawing.EnableUnixSupport": true
   }
}

[appname].runtimeconfig.json kimeneti fájl:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
   }
}

Feljegyzés

  • Ezt a konfigurációs kapcsolót azért adták hozzá, hogy platformfüggetlen alkalmazásokat biztosítson, amelyek nagyban függnek a csomagtól, hogy modernebb kódtárakba migráljanak. A nem Windows-hibák azonban nem lesznek javítva.
  • Ez a kapcsoló csak a .NET 6-ban érhető el, és a .NET 7-ben el lett távolítva. További információ: System.Drawing.Common konfigurációs kapcsoló el lett távolítva.

Érintett API-k

System.Drawing Névtér:

System.Drawing.Drawing2D Névtér:

System.Drawing.Imaging Névtér:

System.Drawing.Printing Névtér:

System.Drawing.Text Névtér:

Lásd még