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 cairo
a , 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.
Javasolt művelet
Ha platformfüggetlen alkalmazásokhoz szeretné használni ezeket az API-kat, migráljon az alábbi kódtárak egyikére:
- SkiaSharp
- ImageSharp (rétegzett licenc)
- Aspose.Drawing (kereskedelmi licenc)
- Microsoft.Maui.Graphics
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.EnableUnixSupport
futtató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:
- 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 Névtér:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging Névtér:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing Névtér:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text Névtér:
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: