System.Drawing.Common, Windows에서만 지원

System.Drawing.Common NuGet 패키지는 이제 Windows 관련 라이브러리로 특성이 지정됩니다. 플랫폼 분석기는 Windows가 아닌 다른 운영 체제에 대해 컴파일할 때 컴파일 시간에 경고를 내보낼 수 있습니다.

Windows 운영 체제에서 런타임 구성 스위치를 설정하지 않는 한, 내부 예외로서 TypeInitializationException 예외가 PlatformNotSupportedException과 함께 throw됩니다.

이전 동작

.NET 6 이전에는 System.Drawing.Common 패키지를 사용하면 컴파일 시간 경고가 생성되지 않았으며 런타임 예외가 throw되지 않았습니다.

새 동작

.NET 6부터 플랫폼 분석기는 Windows 이외의 운영 체제에 대해 코드를 참조할 때 컴파일 시간 경고를 내보낼 수 있습니다. 또한 구성 옵션을 설정하지 않으면 다음 런타임 예외가 throw됩니다.

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

호환성이 손상되는 변경의 형식

이 변경 내용은 원본 호환성이진 호환성에 영향을 줄 수 있습니다.

변경 이유

System.Drawing.Common은 Windows 기술에 대한 씬 래퍼로 설계되었으므로 플랫폼 간 구현은 하위 래퍼입니다.

libgdiplus는 네이티브 쪽에서 플랫폼 간 구현의 기본 System.Drawing.Common 공급자입니다. libgdiplusSystem.Drawing.Common이 의존하는 Windows 부분을 효과적으로 다시 구현하는 것입니다. 이 구현으로 libgdiplus는 중요한 구성 요소가 됩니다. 거의 테스트되지 않은 약 30,000줄의 C 코드이며 많은 기능이 부족합니다. 또한 libgdipluscairo, pango 및 그 외 기본 라이브러리 등 이미지 처리 및 텍스트 렌더링에 대한 다양한 외부 종속성이 있습니다. 이러한 종속성으로 인해 구성 요소를 유지 관리하고 배송하기가 훨씬 더 어려워지고 있습니다. Mono 플랫폼 간 구현이 포함되었기 때문에 수정되지 않은 많은 문제를 libgdiplus로 리디렉션했습니다. 이에 비해 icu 또는 openssl 등 그 밖의 외부 종속성은 고품질 라이브러리입니다. 기능 집합과 품질이 나머지 .NET 스택과 동등한 지점으로 libgdiplus를 보내는 것은 실행 가능하지 않습니다.

NuGet 패키지를 분석한 결과, System.Drawing.Common은 주로 QR 코드 생성기 및 텍스트 렌더링 등 이미지 조작 시 플랫폼 간에 사용되는 것으로 관찰되었습니다. 플랫폼 간 그래픽 지원이 불완전하기 때문에 그래픽 사용량이 많은 것을 알아채지 못했습니다. Windows가 아닌 환경에서 볼 수 있는 System.Drawing.Common의 사용법은 대체로 SkiaSharp 및 ImageSharp에서 잘 지원됩니다.

System.Drawing.Common은 Windows Forms 및 GDI+의 컨텍스트에서만 계속 진화합니다.

플랫폼 간 앱에 이러한 API를 사용하려면 다음 라이브러리 중 하나로 마이그레이션합니다.

또는 runtimeconfig.json 파일에서 System.Drawing.EnableUnixSupport런타임 구성 스위치true로 설정하여 .NET 6에서 Windows 외 플랫폼 지원을 사용하도록 설정할 수 있습니다.

runtimeconfig.template.json 템플릿 파일:

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

[appname].runtimeconfig.json 출력 파일:

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

참고 항목

  • 이 구성 스위치는 최신 라이브러리로 마이그레이션하기 위해 이 패키지 시간에 크게 의존하는 플랫폼 간 앱을 제공할 목적으로 추가되었습니다. 그러나 비 Windows 버그는 수정되지 않습니다.
  • 이 스위치는 .NET 6에서만 사용할 수 있으며 .NET 7에서 제거되었습니다. 자세한 내용은 System.Drawing.Common 구성 스위치가 제거됨을 참조하세요.

영향을 받는 API

System.Drawing 네임스페이스:

System.Drawing.Drawing2D 네임스페이스:

System.Drawing.Imaging 네임스페이스:

System.Drawing.Printing 네임스페이스:

System.Drawing.Text 네임스페이스:

참고 항목