System.Drawing.Common stöds endast i Windows
NuGet-paketet System.Drawing.Common tilldelas nu som ett Windows-specifikt bibliotek. Plattformsanalysatorn avger varning vid kompileringstillfället vid kompilering för operativsystem som inte är Windows.
Om du inte ställer in en körningskonfigurationsväxel på andra operativsystem än Windows genereras ett TypeInitializationException undantag som PlatformNotSupportedException det inre undantaget.
Gammalt beteende
Innan .NET 6 genererades inga kompileringstidsvarningar med hjälp av System.Drawing.Common-paketet och inga körningsfel utlöstes.
Nytt beteende
Från och med .NET 6 genererar plattformsanalysatorn kompileringstidsvarningar när referenskoden kompileras för operativsystem som inte är Windows. Dessutom utlöses följande körningsfel om du inte anger ett konfigurationsalternativ:
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()
Version introducerad
.NET 6
Typ av icke-bakåtkompatibel ändring
Den här ändringen kan påverka källkompatibilitet och binär kompatibilitet.
Orsak till ändringen
Eftersom System.Drawing.Common
den har utformats för att vara en tunn wrapper över Windows-tekniker är dess plattformsoberoende implementering underordnad.
libgdiplus
är den viktigaste leverantören av plattformsoberoende implementering av System.Drawing.Common
på den interna sidan. libgdiplus
är i praktiken en omimplementering av de delar av Windows som System.Drawing.Common
är beroende av. Implementeringen är libgdiplus
en icke-trivial komponent. Det är cirka 30 000 rader C-kod som till stor del är oprövad och saknar många funktioner. libgdiplus
har också många externa beroenden för bildbearbetning och textrendering, till exempel cairo
, pango
och andra interna bibliotek. Dessa beroenden gör underhåll och leverans av komponenten ännu mer utmanande. Sedan implementeringen av monoplattformen togs med har vi omdirigerat många problem till libgdiplus
som aldrig har åtgärdats. Som jämförelse är andra externa beroenden som vi har tagit, till exempel icu
eller openssl
, högkvalitativa bibliotek. Det går inte att komma libgdiplus
till den punkt där dess funktionsuppsättning och kvalitet är i nivå med resten av .NET-stacken.
Från analys av NuGet-paket har vi observerat att System.Drawing.Common
används plattformsoberoende främst för bildmanipulering, till exempel QR-kodgeneratorer och textrendering. Vi har inte märkt någon tung grafikanvändning eftersom vårt plattformsoberoende grafikstöd är ofullständigt. De användningar som vi ser System.Drawing.Common
i icke-Windows-miljöer stöds vanligtvis med SkiaSharp och ImageSharp.
System.Drawing.Common
kommer att fortsätta att utvecklas endast inom ramen för Windows Forms och GDI+.
Rekommenderad åtgärd
Om du vill använda dessa API:er för plattformsoberoende appar migrerar du till något av följande bibliotek:
- SkiaSharp
- ImageSharp (nivåindelad licens)
- Aspose.Drawing (kommersiell licens)
- Microsoft.Maui.Graphics
Du kan också aktivera stöd för andra plattformar än Windows i .NET 6 genom att ange körningskonfigurationsväxlingen till i runtimeconfig.json-filen.true
System.Drawing.EnableUnixSupport
runtimeconfig.template.json mallfil:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
[appname].runtimeconfig.json utdatafil:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
Kommentar
- Den här konfigurationsväxeln har lagts till för att ge plattformsoberoende appar som är starkt beroende av den här pakettiden för att migrera till modernare bibliotek. Buggar som inte är Windows-buggar kommer dock inte att åtgärdas.
- Den här växeln är endast tillgänglig i .NET 6 och har tagits bort i .NET 7. Mer information finns i System.Drawing.Common config switch removed( System.Drawing.Common config switch removed).
Berörda API:er
System.Drawing Namespace:
- 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 Namespace:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging Namespace:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing Namespace:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text Namespace: