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
공급자입니다. libgdiplus
는 System.Drawing.Common
이 의존하는 Windows 부분을 효과적으로 다시 구현하는 것입니다. 이 구현으로 libgdiplus
는 중요한 구성 요소가 됩니다. 거의 테스트되지 않은 약 30,000줄의 C 코드이며 많은 기능이 부족합니다. 또한 libgdiplus
는 cairo
, 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를 사용하려면 다음 라이브러리 중 하나로 마이그레이션합니다.
- SkiaSharp
- ImageSharp(계층화된 라이선스)
- Aspose.Drawing(상업용 라이선스)
- Microsoft.Maui.Graphics
또는 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 네임스페이스:
- Bitmap
- Brush
- Brushes
- BufferedGraphics
- BufferedGraphicsContext
- Font
- FontFamily
- FontConverter
- Graphics
- Icon
- IconConverter
- Image
- ImageAnimator
- Pen
- Pens
- Region
- SolidBrush
- StringFormat
- SystemBrushes
- SystemFonts
- SystemIcons
- SystemPens
- TextureBrush
System.Drawing.Drawing2D 네임스페이스:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging 네임스페이스:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing 네임스페이스:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text 네임스페이스:
참고 항목
.NET