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 cairojsou , pangoa 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.Commonbude nadále vyvíjet pouze v kontextu model Windows Forms a GDI+.

Pokud chcete tato rozhraní API používat pro multiplatformní aplikace, migrujte do jedné z následujících knihoven:

Alternativně můžete povolit podporu pro platformy jiné než Windows v .NET 6 nastavením System.Drawing.EnableUnixSupportpř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 Obor názvů:

System.Drawing.Drawing2D Obor názvů:

System.Drawing.Imaging Obor názvů:

System.Drawing.Printing Obor názvů:

System.Drawing.Text Obor názvů:

Viz také