22

Upgrading NuGet System.Drawing.Common to 6.0.0 causes the following error:

CA1416 This call site is reachable on all platforms. 'Image.FromStream(Stream)' is only supported on: 'windows'.

https://www.nuget.org/packages/System.Drawing.Common/

The affected code is the following:

var drawingImage = System.Drawing.Image.FromStream(memstr);

We use the library to access the method 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;
}

We only host the application on Azure so targeting Windows is fine but replacing GetThumbnailImage is acceptable as well.

Ogglas
  • 62,132
  • 37
  • 328
  • 418

3 Answers3

19

Update:

Targeting Windows worked fine until one of our developers tried to start the solution on his Apple computer using Visual Studio 2022 for Mac Preview 1.

https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416

Reading .NET 6 Breaking changes Microsoft has a section about System.Drawing.Common.

https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only

Their recommendations are the following:

To use these APIs for cross-platform apps, migrate to one of the following libraries:

Alternatively, you can enable support for non-Windows platforms by setting the System.Drawing.EnableUnixSupport runtime configuration switch to true in the runtimeconfig.json file:

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

This configuration switch was added to give cross-platform apps that depend heavily on this package time to migrate to more modern libraries. However, non-Windows bugs will not be fixed. In addition, we may completely remove support for non-Windows platforms in a future release, even if you enable it using the runtime configuration switch.

Note

Despite the name of the runtime switch, System.Drawing.EnableUnixSupport, it applies to various non-Windows platforms, such as macOS and Android, which can generally be considered flavors of Unix.

Even though Microsoft.Maui.Graphics is in preview and is considered an experimental library I tried to use it given that Microsoft has the library as a recommended action library.

It seemed really promising at first but then I encountered a bug in their IImage Downsize method.

https://github.com/dotnet/Microsoft.Maui.Graphics/issues/247

Until that is fixed my temporary solution is using Target framework .NET 6, Target OS (none) and then use Exclude specific warnings as errors given that we have enabled Treat warnings as errors.

enter image description here

I have also created a runtimeconfig.template.json in our web project root with the following values:

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

Original:

After reading about the breaking change on Microsoft Docs and since we only target the Windows platform I decided to do the quickest path to victory for the moment and set Target OS to Windows.

enter image description here

But this code won't warn if the project targets Windows

https://learn.microsoft.com/en-us/dotnet/core/compatibility/code-analysis/5.0/ca1416-platform-compatibility-analyzer

Ogglas
  • 62,132
  • 37
  • 328
  • 418
  • the only fix i needed was the json file. But the syntax was a little wrong for me. It needed to be as described below by Mehmet https://stackoverflow.com/a/74286035/3093731 { "configProperties": { "System.Drawing.EnableUnixSupport": true } } – Andrew Jan 27 '23 at 21:49
  • Tried Microsoft.Maui.Graphics for reading width and height from an uploaded image and they were wrong (or anyway not in pixel, but width was a negative value so don't really know), SkiaSharp looks working great! – Majico Jun 02 '23 at 00:39
2

.NET 6 Breaking changes Microsoft has a section about System.Drawing.Common

  1. add your project runtimeconfig.template.json
{
  "configProperties": {
    "System.Drawing.EnableUnixSupport": true
  }
}
  1. add your DockerFile this or install your linux container
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
RUN apt-get update \
    && apt-get install -y --allow-unauthenticated \
        libc6-dev \
        libgdiplus \
        libx11-dev \
     && rm -rf /var/lib/apt/lists/*
Mehmet Erdoğdu
  • 190
  • 2
  • 8
0

This has been an long open issue

I have got around it by editing my shared assembly info (not autogenerated) with

#if NET6_0
[assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]
#endif
dove
  • 20,469
  • 14
  • 82
  • 108