System.Drawing.Common suportado apenas no Windows
O pacote NuGet System.Drawing.Common agora é atribuído como uma biblioteca específica do Windows. O analisador de plataforma emite aviso em tempo de compilação ao compilar para sistemas operacionais não-Windows.
Em sistemas operacionais que não sejam Windows, a menos que você defina uma opção de configuração de tempo de execução, uma TypeInitializationException exceção é lançada como PlatformNotSupportedException exceção interna.
Comportamento antigo
Antes do .NET 6, o uso do pacote System.Drawing.Common não produzia nenhum aviso em tempo de compilação e nenhuma exceção em tempo de execução era lançada.
Novo comportamento
A partir do .NET 6, o analisador de plataforma emite avisos em tempo de compilação quando o código de referência é compilado para sistemas operacionais que não sejam Windows. Além disso, a seguinte exceção em tempo de execução é lançada, a menos que você defina uma opção de configuração:
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()
Versão introduzida
.NET 6
Tipo de mudança de rutura
Essa alteração pode afetar a compatibilidade de origem e a compatibilidade binária.
Razão para a alteração
Como System.Drawing.Common
foi projetado para ser um wrapper fino sobre as tecnologias Windows, sua implementação entre plataformas é subpar.
libgdiplus
é o principal provedor da implementação multiplataforma do System.Drawing.Common
lado nativo. libgdiplus
é efetivamente uma reimplementação das partes do Windows que System.Drawing.Common
depende. Essa implementação faz libgdiplus
um componente não trivial. São cerca de 30.000 linhas de código C que em grande parte não foram testadas e carecem de muitas funcionalidades. libgdiplus
também tem inúmeras dependências externas para processamento de imagem e renderização de texto, como cairo
, pango
e outras bibliotecas nativas. Essas dependências tornam a manutenção e o envio do componente ainda mais desafiadores. Desde a inclusão da implementação multiplataforma Mono, redirecionamos inúmeros problemas que libgdiplus
nunca foram corrigidos. Em comparação, outras dependências externas que assumimos, como icu
ou openssl
, são bibliotecas de alta qualidade. Não é viável chegar libgdiplus
ao ponto em que seu conjunto de recursos e qualidade estão no mesmo nível do resto da pilha .NET.
A partir da análise de pacotes NuGet, observamos que System.Drawing.Common
é usado multiplataforma principalmente para manipulação de imagens, como geradores de código QR e renderização de texto. Não notamos o uso pesado de gráficos, pois nosso suporte a gráficos multiplataforma está incompleto. Os usos que System.Drawing.Common
vemos em ambientes que não são Windows são normalmente bem suportados com SkiaSharp e ImageSharp.
System.Drawing.Common
continuará a evoluir apenas no contexto do Windows Forms e GDI+.
Ação recomendada
Para usar essas APIs para aplicativos de plataforma cruzada, migre para uma das seguintes bibliotecas:
- SkiaSharp
- ImageSharp (licença hierárquica)
- Aspose.Drawing (licença comercial)
- Microsoft.Maui.Graphics
Como alternativa, você pode habilitar o suporte para plataformas não Windows no .NET 6 definindo a System.Drawing.EnableUnixSupport
opção de configuração de tempo de execução como true
no arquivo runtimeconfig.json.
runtimeconfig.template.json arquivo de modelo:
{
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
[appname].runtimeconfig.json arquivo de saída:
{
"runtimeOptions": {
"configProperties": {
"System.Drawing.EnableUnixSupport": true
}
}
}
Nota
- Essa opção de configuração foi adicionada para dar tempo aos aplicativos multiplataforma que dependem muito desse pacote para migrar para bibliotecas mais modernas. No entanto, bugs que não sejam do Windows não serão corrigidos.
- Essa opção só está disponível no .NET 6 e foi removida no .NET 7. Para obter mais informações, consulte Opção de configuração System.Drawing.Common removida.
APIs afetadas
System.Drawing espaço de nomes:
- 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 espaço de nomes:
- AdjustableArrowCap
- CustomLineCap
- GraphicsPath
- GraphicsPathIterator
- GraphicsState
- HatchBrush
- LinearGradientBrush
- Matrix
- PathGradientBrush
System.Drawing.Imaging espaço de nomes:
- Encoder
- EncoderParameter
- EncoderParameters
- ImageAttributes
- ImageCodecInfo
- ImageFormat
- Metafile
- MetafileHeader
- PlayRecordCallback
System.Drawing.Printing espaço de nomes:
- PageSettings
- PreviewPageInfo
- PrintController
- PrintDocument
- PrinterSettings
- PrintEventArgs
- PrintEventHandler
- PrintPageEventArgs
- PrintPageEventHandler
System.Drawing.Text espaço de nomes: