NuGet System.Drawing.Common .NET 6 CA1416 此调用站点可在所有平台上访问。“Image.FromStream(Stream)”仅支持:“windows”

Ogg*_*las 23 .net c# .net-6.0

将 NuGet 升级System.Drawing.Common到 6.0.0 会导致以下错误:

CA1416 此调用站点可在所有平台上访问。“Image.FromStream(Stream)”仅在“windows”上受支持。

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

受影响的代码如下:

var drawingImage = System.Drawing.Image.FromStream(memstr);
Run Code Online (Sandbox Code Playgroud)

我们使用该库来访问该方法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;
}
Run Code Online (Sandbox Code Playgroud)

我们仅在 Azure 上托管应用程序,因此针对 Windows 是可以的,但替换GetThumbnailImage也是可以接受的。

Ogg*_*las 20

更新:

针对 Windows 运行良好,直到我们的一位开发人员尝试使用Visual Studio 2022 for Mac Preview 1.

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

阅读 .NET 6 重大更改 Microsoft 有一个关于System.Drawing.Common.

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

他们的建议如下:

要将这些 API 用于跨平台应用程序,请迁移到以下库之一:

或者,您可以通过在 runtimeconfig.json 文件中将 System.Drawing.EnableUnixSupport 运行时配置开关设置为 true 来启用对非 Windows 平台的支持:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

添加此配置开关是为了让严重依赖此包的跨平台应用程序有时间迁移到更现代的库。但是,非 Windows 错误不会得到修复。此外,我们可能会在未来版本中完全删除对非 Windows 平台的支持,即使您使用运行时配置开关启用它也是如此。

笔记

尽管运行时开关的名称为 System.Drawing.EnableUnixSupport,但它适用于各种非 Windows 平台,例如 macOS 和 Android,这些平台通常可以被视为 Unix 的风格。

尽管Microsoft.Maui.Graphics处于预览阶段并且被认为是实验性库,但考虑到 Microsoft 将该库作为推荐的操作库,我尝试使用它。

起初看起来确实很有希望,但后来我在他们的IImage Downsize方法中遇到了一个错误。

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

在这个问题得到解决之前,我的临时解决方案是使用目标框架 .NET 6、目标操作系统(无),然后在Exclude specific warnings as errors我们启用了 .NET 的情况下使用Treat warnings as errors

在此输入图像描述

我还在runtimeconfig.template.json我们的网络项目根目录中创建了一个具有以下值的值:

{
   "runtimeOptions": {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

原来的:

在阅读了 Microsoft Docs 上的重大更改后,由于我们只针对 Windows 平台,我决定暂时采用最快的方式取得胜利,并将目标操作系统设置为Windows.

在此输入图像描述

但如果项目面向 Windows,此代码不会发出警告

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