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 wyjątki czasu wykonywania.

Nowe zachowanie

Począwszy od platformy .NET 6, analizator platformy emituje ostrzeżenia czasu kompilacji podczas kompilowania kodu jest kompilowany dla systemów operacyjnych innych niż Windows. Ponadto jest zgłaszany 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 zmiany

Ponieważ System.Drawing.Common została zaprojektowana jako cienka otoka technologii systemu Windows, jej implementacja międzyplatformowa jest podrzędna.

libgdiplus jest głównym dostawcą implementacji międzyplatformowej System.Drawing.Common po stronie natywnej. libgdiplus Jest to skuteczne ponowne wdrożenie części systemu Windows, od których System.Drawing.Common zależy. 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 niesprawdzone 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 jeszcze bardziej wymagają utrzymania i wysłania składnika. Od momentu włączenia implementacji międzyplatformowej Mono przekierowowaliśmy wiele problemów do libgdiplus tego, które nigdy nie zostały rozwiązane. Dla porównania inne zależności zewnętrzne, takie jak icu lub openssl, są bibliotekami 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.

Na podstawie 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. Użycie, które System.Drawing.Common widzimy w środowiskach innych niż Windows, są zwykle dobrze obsługiwane w przypadku bibliotek SkiaSharp i ImageSharp.

System.Drawing.Commonbę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.EnableUnixSupportprzełącznik konfiguracji środowiska uruchomieniowego na true w pliku runtimeconfig.json .

plik szablonu runtimeconfig.template.json:

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

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

{
   "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. Błędy nienależące do systemu Windows nie zostaną jednak naprawione.
  • Ten przełącznik jest dostępny tylko na platformie .NET 6 i został usunięty na platformie .NET 7.

Dotyczy interfejsów API

System.Drawing Obszaru nazw:

System.Drawing.Drawing2D Obszaru nazw:

System.Drawing.Imaging Obszaru nazw:

System.Drawing.Printing Obszaru nazw:

System.Drawing.Text Obszaru nazw:

Zobacz też