System.Drawing.Common 僅於 Windows 上支援
System.Drawing.Common NuGet 套件現在屬性設為 Windows 特定的程式庫。 針對非 Windows 作業系統進行編譯時,平台分析器會在編譯時發出警告。
在非 Windows 作業系統上,除非您設定執行時間組態參數,否則 PlatformNotSupportedException 會以作為內部例外狀況擲回 TypeInitializationException 例外狀況。
舊的行為
在 .NET 6 之前,使用 System.Drawing.Common 套件不會產生任何編譯時間警告,也不會擲回任何執行時間例外狀況。
新的行為
從 .NET 6 開始,平台分析器會在針對非 Windows 作業系統編譯參考程式碼時發出編譯時間警告。 此外,除非您設定組態選項,否則會擲回下列執行時間例外狀況:
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()
導入的版本
.NET 6
中斷性變更的類型
變更原因
由於 System.Drawing.Common
是設計成 Windows 技術的精簡包裝函式,所以其跨平台實作欠佳。
libgdiplus
是原生端上 System.Drawing.Common
跨平台實作的主要提供者。 libgdiplus
實際上是重新實作 System.Drawing.Common
相依的 Windows 部分。 該實作會將 libgdiplus
視作非一般的元件。 大約是 30,000 行 C 程式碼,大部分未測試,而且缺少許多功能。 libgdiplus
也有許多外部相依性,可用於影像處理和文字轉譯,例如 cairo
、pango
和其他原生程式庫。 這些相依性讓維護和傳送元件變得更具挑戰性。 因為包含了 Mono 跨平台實作,我們已將許多從未修正的問題重新導向至 libgdiplus
。 相較之下,我們採用的其他外部相依性,例如 icu
或 openssl
都是高品質的程式庫。 libgdiplus
無法達到其功能集和品質與 .NET 堆疊其餘部分相等的情況。
從 NuGet 套件的分析中,我們觀察到 System.Drawing.Common
大部分用於影像操作的跨平台,例如 QR 代碼產生器和文字轉譯。 我們尚未注意到大量的圖形使用量,因為我們的跨平台圖形支援不完整。 我們在非 Windows 環境中看到的 System.Drawing.Common
使用方式通常有 SkiaSharp 和 ImageSharp 的良好支援。
System.Drawing.Common
只會在 Windows Forms 和 GDI+ 的內容中持續演進。
建議的動作
若要針對跨平台應用程式使用這些 API,請移轉至下列其中一個程式庫:
- SkiaSharp
- ImageSharp (階層式授權)
- Aspose.Drawing (商業授權)
- Microsoft.Maui.Graphics
或者,您可以將 runtimeconfig.json 檔案中System.Drawing.EnableUnixSupport
執行階段組態參數設為 true
,以啟用 .NET 6 中非 Windows 平台的支援。
runtimeconfig.template.json 範本檔案:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
[appname].runtimeconfig.json 輸出檔案:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
注意
- 已新增此組態參數來提供高度相依於此套件時間的跨平台應用程式,以遷移至更現代化的程式庫。 不過,不會修正非 Windows 錯誤。
- 此參數只能在 .NET 6 中使用,並在 .NET 7 中移除。 如需詳細資訊,請參閱已移除 System.Drawing.Common 組態參數。
受影響的 API
System.Drawing 命名空間:
- Bitmap
- Brush
- Brushes
- BufferedGraphics
- BufferedGraphicsContext
- Font
- FontFamily
- FontConverter
- Graphics
- Icon
- IconConverter
- Image
- ImageAnimator
- Pen
- Pens
- Region
- SolidBrush
- StringFormat
- SystemBrushes
- SystemFonts
- SystemIcons
- SystemPens
- TextureBrush
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text 命名空間: