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 也有許多外部相依性,可用於影像處理和文字轉譯,例如 cairopango 和其他原生程式庫。 這些相依性讓維護和傳送元件變得更具挑戰性。 因為包含了 Mono 跨平台實作,我們已將許多從未修正的問題重新導向至 libgdiplus。 相較之下,我們採用的其他外部相依性,例如 icuopenssl 都是高品質的程式庫。 libgdiplus 無法達到其功能集和品質與 .NET 堆疊其餘部分相等的情況。

從 NuGet 套件的分析中,我們觀察到 System.Drawing.Common 大部分用於影像操作的跨平台,例如 QR 代碼產生器和文字轉譯。 我們尚未注意到大量的圖形使用量,因為我們的跨平台圖形支援不完整。 我們在非 Windows 環境中看到的 System.Drawing.Common 使用方式通常有 SkiaSharp 和 ImageSharp 的良好支援。

System.Drawing.Common 只會在 Windows Forms 和 GDI+ 的內容中持續演進。

若要針對跨平台應用程式使用這些 API,請移轉至下列其中一個程式庫:

或者,您可以將 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 命名空間:

System.Drawing.Drawing2D命名空間:

System.Drawing.Imaging命名空間:

System.Drawing.Printing命名空間:

System.Drawing.Text 命名空間:

另請參閱