代码之家  ›  专栏  ›  技术社区  ›  Ogglas

CA1416所有平台都可以访问此呼叫站点。”形象FromStream(Stream)“仅在以下位置受支持:”windows“

  •  0
  • Ogglas  · 技术社区  · 4 年前

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

    CA1416所有平台都可以访问此呼叫站点。 形象FromStream(Stream)“仅在以下位置受支持:”windows“。”。

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

    受影响的代码如下:

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

    我们使用库来访问方法 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;
    }
    

    我们只在Azure上托管应用程序,因此以Windows为目标是可以的,但替换 获取缩略图图像 也是可以接受的。

    1 回复  |  直到 4 年前
        1
  •  18
  •   Ogglas    4 年前

    使现代化

    在我们的一位开发人员尝试在他的苹果电脑上使用 Visual Studio 2022 for Mac Preview 1 .

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

    阅读NET 6突破性变化微软有一节关于 System.Drawing.Common .

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

    他们的建议如下:

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

    或者,您可以通过以下方式启用对非Windows平台的支持 设置系统。绘画EnableUnixSupport运行时配置 在runtimeconfig.json文件中切换为true:

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

    添加此配置开关是为了使跨平台应用程序 在很大程度上依赖于这个包时间来迁移到更现代的 图书馆。但是,非Windows错误不会被修复。此外 我们将来可能会完全取消对非Windows平台的支持 发布,即使您使用运行时配置开关启用了它。

    笔记

    不管运行时交换机的名称如何, 系统绘画EnableUnixSupport,它适用于各种非Windows 平台,如macOS和Android,通常可以 被认为是Unix的风格。

    尽管 Microsoft.Maui.Graphics 正在预览中,被认为是一个实验库,我试图使用它,因为微软将该库作为推荐的操作库。

    一开始看起来很有希望,但后来我在他们的 IImage Downsize 方法

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

    在修复之前,我的临时解决方案是使用Target框架。NET 6,目标操作系统(无),然后使用 Exclude specific warnings as errors 考虑到我们已经启用 Treat warnings as errors .

    enter image description here

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

    {
    “runtimeOptions”:{
    “configProperties”:{
    “System.Drawing.EnableUnixSupport”:true
    }
    }
    }
    

    起初的

    在阅读了微软文档上的突破性变化后,由于我们只针对Windows平台,我决定暂时采取最快的方式取得胜利,并将目标操作系统设置为 Windows .

    enter image description here

    但如果项目以Windows为目标,则此代码不会发出警告

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

        2
  •  2
  •   Mehmet Erdoğdu    3 年前

    .NET 6突破性变化微软有一节关于 系统绘画常见的

    1. 添加您的项目 运行时配置模板.json
    {
      "configProperties": {
        "System.Drawing.EnableUnixSupport": true
      }
    }
    
    1. 添加您的 Docker文件 这个或安装您的linux容器
    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/*
    
        3
  •  0
  •   dove    4 年前

    这是一个长期开放的 issue

    I have got around it 通过编辑我的共享程序集信息(不是自动生成的)

    #if NET6_0
    [assembly: System.Runtime.Versioning.SupportedOSPlatform("windows7.0")]
    #endif