如何修复 Visual Studio 2022 警告 CA1416“所有平台均可访问调用站点”但“仅支持:'windows'”?

Ron*_*n C 43 c# code-analysis visual-studio microsoft.codeanalysis .net-6.0

所以我有一个 C# 类库项目,我只打算在 Windows 上使用。它包含一些使用System.Drawing.Image仅在 Windows 上可用的类的类。升级到 Visual Studio 2022 并将目标框架设置为 .NET 6.0 后,我看到一堆警告:

\n
\n

CA1416 “此调用站点可在所有平台上访问。\'SomeClass.SomeMethod\' 仅在以下平台上受支持:\'windows\'。

\n
\n

请参阅下面的屏幕截图了解一些示例:

\n

Visual Studio 2022 中的“错误列表”窗格显示多个 CA1416“此调用站点在所有平台上均可访问。\'.\' 仅在:\'windows\' 上受支持。”  错误

\n

从某种意义上说,VS2022 扫描了库并找到了我在库中使用的所有平台特定代码,这很酷。但我想告诉 VS,我只打算在 Windows 上使用该库,它可以消除所有这些警告。

\n

首先,我检查了Target framework项目属性中的选项,但没有看到任何 Windows 特定目标。

\n

项目属性的应用程序 \xe2\x86\x92 常规页面上的“目标框架”下拉框已展开以显示 .NET、.NET Core 和 .NET Framework 的可用版本

\n

然后我决定直接编辑项目.csproj并更改Target framework

\n
<TargetFramework>net6.0</TargetFramework>\n
Run Code Online (Sandbox Code Playgroud)\n

\n
<TargetFramework>net6.0-windows</TargetFramework>\n
Run Code Online (Sandbox Code Playgroud)\n

但是,遗憾的是,即使在重新编译之后,警告也没有消失。然后我读了一些警告CA1416,果然Microsoft Docs中说,评估此警告时会忽略目标框架名称,但是,VS 确实根据影响此警告的 TFM 向项目添加了一个属性,但是仅当项目配置为AssemblyInfo.cs动态生成文件时,它才会这样做。但是,唉,我的项目是AssemblyInfo.cs作为实际文件维护的,而不是在构建时自动生成的。

\n

因此,此时,我已准备好踢球并禁用CA1416我的项目的警告。因此,在项目的.proj文件中,我添加了CA1416发布和调试版本,如下所示:

\n
<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Debug|AnyCPU\'">\n    <NoWarn>1701;1702;CA1416;</NoWarn>\n</PropertyGroup>\n\n<PropertyGroup Condition="\'$(Configuration)|$(Platform)\'==\'Release|AnyCPU\'">\n    <NoWarn>1701;1702;CA1416;</NoWarn>\n</PropertyGroup>\n
Run Code Online (Sandbox Code Playgroud)\n

人们可能会认为那些烦人的警告就到此结束了。(叹气)\n事实证明,重建项目后警告仍然出现。有什么建议吗?我洗耳恭听。

\n

小智 43

通过将以下装饰器添加到包含类的顶部,我成功删除了 CA1416 警告:

[System.Runtime.Versioning.SupportedOSPlatform("windows")]
Run Code Online (Sandbox Code Playgroud)

我只使用 VS2019 并使用 .net 5,但它可能适合你。我尝试使用 VS2019 .net5 控制台项目(顶级程序)和 .net5 类库(顶级)。我添加了 System.Common.Drawing nuget 包。我的代码包括:

string inputPath = @"C:\mypath\mypng.png";
Image i = Image.FromFile(inputPath);
Run Code Online (Sandbox Code Playgroud)

  • 我在一个项目中遇到了这个问题,我有一个“AssemblyInfo.cs”文件,而不是使用项目属性:`&lt;GenerateAssemblyInfo&gt;false&lt;/GenerateAssemblyInfo&gt;`。在这里,我可以在 AssemblyInfo.cs 中声明该属性: `[ assembly: System.Runtime.Versioning.SupportedOSPlatform("windows")]` (6认同)

Ogg*_*las 14

更新:

针对 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)

原来的:

您可以使用 imao 抑制警告dotnet_diagnostic.CA1416.severity = none,但如果您只想在 Windows 上使用它,则应该将目标操作系统设置Windows为将修复警告的项目。

在此输入图像描述

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

来源:

/sf/answers/4919078041/

  • 从 2022 年 1 月的 VS2022 V17.0.5 开始,这似乎不起作用。将 TargetOS 设置为 Windows 后,我仍然看到报告 CA1416。[SupportedOsPlatform("windows")] 现在似乎是更好的解决方案。 (8认同)

Ron*_*n C 8

解决此问题的一种方法是为解决方案创建一个 .editorconfig,然后将以下行添加到该 .editorconfig 文件中:

dotnet_diagnostic.CA1416.severity = none

这将使所有“验证平台兼容性”警告消失。

  • 您好,Ronc,很高兴知道您已经找到解决此问题的解决方案!请考虑接受它作为答案,将其状态更改为“已答复”。只是提醒 :) (2认同)