只支援 Windows 的 Common

NuGet 套件現在會以 Windows 特定的程式庫屬性。 編譯非 Windows 作業系統時,平臺分析器會在編譯時期發出警告。

在非 Windows 的作業系統上,除非您設定執行時間設定參數, TypeInitializationException 否則會擲回例外狀況,並 PlatformNotSupportedException 以做為內部例外狀況。

舊的行為

在 .NET 6 之前,使用 [System.object]。一般封裝未產生任何編譯時期警告,而且未擲回執行時間例外狀況。

新的行為

從 .net 6 開始,當針對非 Windows 作業系統編譯參考程式碼時,platform analyzer 會發出編譯時期警告。 此外,除非您設定了設定選項,否則會擲回下列執行時間例外狀況:

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

中斷性變更的類型

這種變更可能會影響 來源相容性二進位相容性

變更的原因

由於是設計成 Windows 技術的精簡型包裝函式,因此 System.Drawing.Common 它的跨平臺欠佳。

libgdiplus 是原生端上跨平臺執行 System.Drawing.Common 的主要提供者。 libgdiplus實際上是 Windows System.Drawing.Common 相依的部分重新實作。 該執行會 libgdiplus 造成非一般的元件。 這大約是30000行的 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,請遷移至下列其中一個程式庫:

或者,您可以在true檔案中,將System.Drawing.EnableUnixSupport時間設定參數設定 System.Drawing.EnableUnixSupport 為,以 true 啟用 .net 6 中非 Windows 平臺的支援:

{
   "configProperties": {
      "System.Drawing.EnableUnixSupport": true
   }
}

已新增此設定參數,以提供大量相依于此封裝時間的跨平臺應用程式,以遷移至更新式的程式庫。 但是,不會修正非 Windows 的 bug。 此外,已在 .NET 7 中移除此參數。

受影響的 API

System.Drawing 命名 空間:

System.Drawing.Drawing2D 命名 空間:

System.Drawing.Imaging 命名 空間:

System.Drawing.Printing 命名 空間:

System.Drawing.Text 命名 空間:

另請參閱

  • 僅支援 Windows-dotnet/設計