Partilhar via


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, pangoe 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+.

Para usar essas APIs para aplicativos de plataforma cruzada, migre para uma das seguintes bibliotecas:

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:

System.Drawing.Drawing2D espaço de nomes:

System.Drawing.Imaging espaço de nomes:

System.Drawing.Printing espaço de nomes:

System.Drawing.Text espaço de nomes:

Consulte também