System.Drawing.Common se podporuje jenom ve Windows
Balíček System.Drawing.Common NuGet je nyní přiřazený jako knihovna specifická pro Windows. Analyzátor platformy generuje upozornění při kompilaci pro operační systémy jiného systému než Windows.
Pokud nenastavíte přepínač konfigurace modulu runtime, TypeInitializationException v jiných operačních systémech než Windows se jako vnitřní výjimka vyvolá PlatformNotSupportedException výjimka.
Staré chování
Před rozhraním .NET 6 se při použití balíčku System.Drawing.Common nevygenerovaly žádná upozornění v době kompilace a nebyly vyvolány žádné výjimky za běhu.
Nové chování
Počínaje rozhraním .NET 6 generuje analyzátor platformy upozornění v době kompilace při odkazování na kód pro operační systémy jiného než Windows. Kromě toho se vyvolá následující výjimka za běhu, pokud nenastavíte možnost konfigurace:
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()
Zavedená verze
.NET 6
Typ zásadní změny
Tato změna může ovlivnit kompatibilitu zdroje a binární kompatibilitu.
Důvod změny
Vzhledem k tomu System.Drawing.Common
, že byla navržena tak, aby byla tenkým obalem nad technologiemi Windows, její implementace napříč platformami je podparována.
libgdiplus
je hlavním poskytovatelem multiplatformní implementace System.Drawing.Common
na nativní straně. libgdiplus
je účinně reimplementace částí Systému Windows, které System.Drawing.Common
závisí na. Díky této implementaci není libgdiplus
triviální komponenta. Je to asi 30 000 řádků kódu C, který je z velké části neotestovaný a nemá mnoho funkcí. libgdiplus
má také řadu externích závislostí pro zpracování obrázků a vykreslování textu, jako cairo
jsou , pango
a další nativní knihovny. Díky těmto závislostem je údržba a přesouvání komponenty ještě náročnější. Vzhledem k tomu, že zahrnutí implementace Mono pro různé platformy jsme přesměrovali řadu problémů, na libgdiplus
které jsme se nikdy neopravili. Ve srovnání s jinými externími závislostmi, které jsme provedli, například icu
nebo openssl
, jsou vysoce kvalitní knihovny. Není možné se dostat libgdiplus
k bodu, kdy je jeho sada funkcí a kvalita v souladu se zbytkem zásobníku .NET.
Z analýzy balíčků NuGet jsme zjistili, že System.Drawing.Common
se používá pro více platforem převážně pro manipulaci s obrázky, jako jsou generátory kódu QR a vykreslování textu. Nevšimli jsme si velkého využití grafiky, protože naše podpora grafiky pro různé platformy je neúplná. Využití, která System.Drawing.Common
vidíme v prostředích mimo Windows, jsou obvykle dobře podporovaná v prostředíCh SkiaSharp a ImageSharp.
System.Drawing.Common
bude nadále vyvíjet pouze v kontextu model Windows Forms a GDI+.
Doporučená akce
Pokud chcete tato rozhraní API používat pro multiplatformní aplikace, migrujte do jedné z následujících knihoven:
- SkiaSharp
- ImageSharp (vrstvené licence)
- Aspose.Drawing (komerční licence)
- Microsoft.Maui.Graphics
Alternativně můžete povolit podporu pro platformy jiné než Windows v .NET 6 nastavením System.Drawing.EnableUnixSupport
přepínače konfigurace modulu runtime do true
souboru runtimeconfig.json .
runtimeconfig.template.json souboru šablony:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
[appname].runtimeconfig.json výstupní soubor:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
Poznámka:
- Tento přepínač konfigurace byl přidán, aby bylo možné poskytovat multiplatformní aplikace, které jsou v této době závislé na migraci do modernějších knihoven. Chyby, které nejsou windows, se ale neopraví.
- Tento přepínač je k dispozici pouze v .NET 6 a byl odebrán v .NET 7. Další informace naleznete v tématu System.Drawing.Common config switch removed.
Ovlivněná rozhraní API
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: