Udostępnij za pośrednictwem


System.Drawing.Common obsługiwany tylko w systemie Windows

Pakiet NuGet System.Drawing.Common jest teraz przypisywany jako biblioteka specyficzna dla systemu Windows. Analizator platformy emituje ostrzeżenie w czasie kompilacji podczas kompilowania dla systemów operacyjnych innych niż Windows.

W systemach operacyjnych innych niż Windows, chyba że ustawiono przełącznik konfiguracji środowiska uruchomieniowego, TypeInitializationException wyjątek jest zgłaszany PlatformNotSupportedException jako wyjątek wewnętrzny.

Stare zachowanie

Przed platformą .NET 6 użycie pakietu System.Drawing.Common nie wygenerowało żadnych ostrzeżeń w czasie kompilacji i nie zostały zgłoszone żadne wyjątki czasu wykonywania.

Nowe zachowanie

Począwszy od platformy .NET 6, analizator platformy emituje ostrzeżenia czasu kompilacji podczas odwoływania się do kodu jest kompilowany dla systemów operacyjnych innych niż Windows. Ponadto zgłaszany jest następujący wyjątek w czasie wykonywania, chyba że ustawiono opcję konfiguracji:

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()

Wprowadzona wersja

.NET 6

Typ zmiany powodującej niezgodność

Ta zmiana może mieć wpływ na zgodność źródła i zgodność binarną.

Przyczyna wprowadzenia zmiany

Ponieważ System.Drawing.Common została zaprojektowana tak, aby była cienką otoką technologii systemu Windows, jej implementacja międzyplatformowa jest podrzędna.

libgdiplus jest głównym dostawcą implementacji System.Drawing.Common międzyplatformowej po stronie natywnej. libgdiplus Jest to skuteczne ponowne wdrożenie części systemu Windows, które System.Drawing.Common są zależne. Ta implementacja sprawia, że libgdiplus składnik nie jest trywialny. Jest to około 30 000 wierszy kodu C, które są w dużej mierze nietestowane i brakuje mu wielu funkcji. libgdiplus Ma również wiele zależności zewnętrznych do przetwarzania obrazów i renderowania tekstu, takich jak cairo, pangoi inne biblioteki natywne. Te zależności sprawiają, że utrzymywanie i dostarczanie składnika jest jeszcze trudniejsze. Od czasu włączenia implementacji międzyplatformowej mono przekierowowaliśmy wiele problemów, które libgdiplus nigdy nie zostały rozwiązane. W porównaniu z innymi zależnościami zewnętrznymi, takimi jak icu lub openssl, są biblioteki wysokiej jakości. Nie można przejść libgdiplus do punktu, w którym jego zestaw funkcji i jakość są na równi z resztą stosu platformy .NET.

Z analizy pakietów NuGet zaobserwowaliśmy, że System.Drawing.Common jest używana międzyplatformowo głównie do manipulowania obrazami, takich jak generatory kodu QR i renderowanie tekstu. Nie zauważyliśmy dużego użycia grafiki, ponieważ nasza obsługa grafiki międzyplatformowej jest niekompletna. System.Drawing.Common Użycie widoczne w środowiskach innych niż Windows jest zwykle dobrze obsługiwane w przypadku bibliotek SkiaSharp i ImageSharp.

System.Drawing.Common będzie nadal ewoluować tylko w kontekście windows Forms i GDI+.

Aby użyć tych interfejsów API dla aplikacji międzyplatformowych, przeprowadź migrację do jednej z następujących bibliotek:

Alternatywnie można włączyć obsługę platform innych niż Windows na platformie .NET 6, ustawiając System.Drawing.EnableUnixSupport przełącznik konfiguracji środowiska uruchomieniowego na true w pliku runtimeconfig.json .

runtimeconfig.template.json plik szablonu:

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

[appname].runtimeconfig.json plik wyjściowy:

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

Uwaga

  • Ten przełącznik konfiguracji został dodany w celu nadania aplikacjom międzyplatformowym, które w dużym stopniu zależą od czasu migracji pakietu do bardziej nowoczesnych bibliotek. Jednak błędy inne niż Windows nie zostaną naprawione.
  • Ten przełącznik jest dostępny tylko na platformie .NET 6 i został usunięty na platformie .NET 7. Aby uzyskać więcej informacji, zobacz System.Drawing.Common config switch removed (Usunięto przełącznik konfiguracji System.Drawing.Common).

Dotyczy interfejsów API

System.Drawing Namespace:

System.Drawing.Drawing2D Namespace:

System.Drawing.Imaging Namespace:

System.Drawing.Printing Namespace:

System.Drawing.Text Namespace:

Zobacz też