La actualización de NuGet System.Drawing.Common a 6.0.0 provoca el siguiente error:
CA1416 Se puede acceder a este sitio de llamadas en todas las plataformas. 'Image.FromStream(Stream)' solo se admite en: 'windows'.
https://www.nuget.org/packages/System.Drawing.Common/
El código afectado es el siguiente:
var drawingImage = System.Drawing.Image.FromStream(memstr); Usamos la biblioteca para acceder al método GetThumbnailImage .
public byte[] GetThumbnailBytes(byte[] imageBytes) { var thumbnailBytes = Array.Empty<byte>(); using (MemoryStream memstr = new MemoryStream(imageBytes)) { var drawingImage = System.Drawing.Image.FromStream(memstr); var thumbnailSize = GetThumbnailSize(drawingImage); var thumbnail = drawingImage.GetThumbnailImage(thumbnailSize.Width, thumbnailSize.Height, null, IntPtr.Zero); var ms = thumbnail.ToStream(drawingImage.RawFormat); thumbnailBytes = ms.ReadFully(); } return thumbnailBytes; } Solo alojamos la aplicación en Azure, por lo que apuntar a Windows está bien, pero también es aceptable reemplazar GetThumbnailImage .
Actualizar:
Apuntar a Windows funcionó bien hasta que uno de nuestros desarrolladores intentó iniciar la solución en su computadora Apple usando Visual Studio 2022 for Mac Preview 1 .
https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416
Leer .NET 6 Cambios importantes Microsoft tiene una sección sobre System.Drawing.Common .
Sus recomendaciones son las siguientes:
Para usar estas API para aplicaciones multiplataforma, migre a una de las siguientes bibliotecas:
Como alternativa, puede habilitar la compatibilidad con plataformas que no sean de Windows configurando el conmutador de configuración de tiempo de ejecución System.Drawing.EnableUnixSupport en verdadero en el archivo runtimeconfig.json:
{ "runtimeOptions": { "configProperties": { "System.Drawing.EnableUnixSupport": true } } }Este cambio de configuración se agregó para dar tiempo a las aplicaciones multiplataforma que dependen en gran medida de este paquete para migrar a bibliotecas más modernas. Sin embargo, los errores que no sean de Windows no se corregirán. Además, es posible que eliminemos por completo la compatibilidad con plataformas que no sean de Windows en una versión futura, incluso si lo habilita mediante el interruptor de configuración de tiempo de ejecución.
Nota
A pesar del nombre del modificador de tiempo de ejecución, System.Drawing.EnableUnixSupport, se aplica a varias plataformas que no son de Windows, como macOS y Android, que generalmente pueden considerarse variantes de Unix.
Aunque Microsoft.Maui.Graphics está en versión preliminar y se considera una biblioteca experimental, traté de usarla dado que Microsoft tiene la biblioteca como biblioteca de acción recomendada.
Parecía realmente prometedor al principio, pero luego encontré un error en su método IImage Downsize .
https://github.com/dotnet/Microsoft.Maui.Graphics/issues/247
Hasta que eso se solucione, mi solución temporal es usar Target framework .NET 6, Target OS (ninguno) y luego usar Exclude specific warnings as errors dado que hemos habilitado Treat warnings as errors .
También he creado un runtimeconfig.template.json en la raíz de nuestro proyecto web con los siguientes valores:
{ "runtimeOptions": { "configProperties": { "System.Drawing.EnableUnixSupport": true } } }Original:
Después de leer sobre el cambio de última hora en Microsoft Docs y dado que solo apuntamos a la plataforma Windows, decidí hacer el camino más rápido hacia la victoria por el momento y configurar Target OS en Windows .
Pero este código no avisará si el proyecto apunta a Windows
Este ha sido un tema abierto durante mucho tiempo.
Lo solucioné editando mi información de ensamblaje compartida (no generada automáticamente) con
#if NET6_0 [assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")] #endif