Dela via


System.Drawing.Common stöds endast i Windows

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 genererades inga kompileringstidsvarningar med hjälp av System.Drawing.Common-paketet och inga körningsfel 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örningsfel 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+.

Om du vill använda dessa API:er för plattformsoberoende appar migrerar du till något av följande bibliotek:

Du kan också aktivera stöd för icke-Windows-plattformar i .NET 6 genom att ange körningskonfigurationsväxlingen System.Drawing.EnableUnixSupport till true i filen runtimeconfig.json.

runtimeconfig.template.json mallfil:

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

[appname].runtimeconfig.json utdatafil:

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

Kommentar

Berörda API:er

System.Drawing Namnområde:

System.Drawing.Drawing2D Namnområde:

System.Drawing.Imaging Namnområde:

System.Drawing.Printing Namnområde:

System.Drawing.Text Namnområde:

Se även