Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 genererade användningen av paketet System.Drawing.Common inga kompileringstidsvarningar, och inga körningsundantag 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örningsundatag 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, pangooch 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-filenSystem.Drawing.EnableUnixSupport.true
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: