如何修复Visual Studio 2022警告CA1416“调用所有平台都可访问的站点”,但“仅在以下平台上支持:“Windows”?

0qx6xfy6  于 2023-04-07  发布在  Windows
关注(0)|答案(5)|浏览(1431)

所以我有一个C#类库项目,我只打算在Windows上使用。它包含一些使用System.Drawing.Image类的类,这些类只在Windows上可用。升级到Visual Studio 2022并将目标框架设置为.NET 6.0后,我看到一堆警告:
CA1416“在所有平台上都可以访问此调用站点。'SomeClass.SomeMethod'仅在以下平台上受支持:Windows
请参见下面的屏幕截图以获取一些示例:

从某种意义上说,VS2022已经扫描了库,并找到了我在库中使用的所有平台特定代码,这很酷。但我想告诉VS,我只打算在Windows上使用库,它可以静音所有这些警告。
首先,我检查了项目属性中的Target framework选项,但没有看到任何windows特定的目标。

然后我决定直接编辑项目的.csproj,并将Target framework

<TargetFramework>net6.0</TargetFramework>

<TargetFramework>net6.0-windows</TargetFramework>

但是,不幸的是,即使重新编译后,也没有使警告消失。所以后来我读了一些关于CA1416警告的文章,果然在Microsoft Docs中说,在评估这个警告时忽略了目标框架的名字,然而,VS确实根据影响这个警告的TFM向项目添加了一个属性,但是,遗憾的是,我的项目的AssemblyInfo.cs是作为一个实际的文件维护的,而不是在构建时自动生成的。
因此,在这一点上,我准备踢球,只是为我的项目禁用CA1416警告。因此,在项目的.proj文件中,我为发布和调试版本添加了CA1416如下:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>1701;1702;CA1416;</NoWarn>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <NoWarn>1701;1702;CA1416;</NoWarn>
</PropertyGroup>

有人会认为这将是那些讨厌的警告的结束。(叹气)事实证明,在重建项目后,警告仍然出现。有什么建议吗?我洗耳恭听。

dvtswwa3

dvtswwa31#

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

[System.Runtime.Versioning.SupportedOSPlatform("windows")]

我只在VS2019上使用.net 5,但它可能对你有用。我用VS2019. net5控制台项目(类Program的顶部)和.net5类库(类的顶部)尝试了这个。我添加了System.Common.Drawing nuget包。我的代码包括:

string inputPath = @"C:\mypath\mypng.png";
Image i = Image.FromFile(inputPath);
x7rlezfr

x7rlezfr2#

更新:

以Windows为目标一直运行良好,直到我们的一位开发人员尝试在他的Apple计算机上使用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用于跨平台应用,请迁移到以下库之一:

  • ImageSharp
  • [2]第二季
  • [Microsoft.Maui.Graphics][3]

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

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

添加此配置开关是为了给予严重依赖此程序包的跨平台应用有时间迁移到更现代的库。但是,不会修复非Windows错误。此外,我们可能会在未来版本中完全删除对非Windows平台的支持,即使您使用运行时配置开关启用了它。
注意
尽管运行时开关的名称是System.Drawing.EnableUnixSupport,但它适用于各种非Windows平台,例如macOS和Android,这些平台通常被认为是Unix的风格。
尽管Microsoft.Maui.Graphics是预览版,并且被认为是一个实验库,但我还是尝试使用它,因为Microsoft将该库作为推荐的操作库。
一开始看起来很有希望,但后来我在他们的IImage Downsize方法中遇到了一个bug。
https://github.com/dotnet/Microsoft.Maui.Graphics/issues/247
在此之前,我的临时解决方案是使用目标框架.NET 6,目标操作系统(无),然后使用Exclude specific warnings as errors,因为我们已经启用了Treat warnings as errors

我还在我们的Web项目根目录中创建了一个runtimeconfig.template.json,其值如下:

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

原件:

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

https://learn.microsoft.com/en-us/dotnet/core/compatibility/code-analysis/5.0/ca1416-platform-compatibility-analyzer
来源:
https://stackoverflow.com/a/70272543/3850405

j0pj023g

j0pj023g3#

解决此问题的一种方法是为解决方案创建一个.editorconfig,然后将以下行添加到该.editorconfig文件中:
dotnet_diagnostic.CA1416.severity = none
这将使所有“验证平台兼容性”警告消失。

cyvaqqii

cyvaqqii4#

与@RonC所做的类似,我能够通过向我的.ruleset文件添加一个规则来解决这个问题:

<Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">  
  <Rule Id="CA1416" Action="None"/>
</Rules>

请记住,这将应用于使用规则集文件的整个项目。

zqry0prt

zqry0prt5#

在从Visual Studio 2017与Dot Net 4.84升级到Visual Studio 2022与Dot NetT 7.0之后,我在联系Microsoft和GitHub Repo之后,每次出现外部库都会得到一个警告,解决方案是否简单

如图所示,升级过程将Dot Net Framework设置为7.0,但版本保持在7.0,但对于Windows 7,没有Dot Net 7.0可用。
将版本更改为Windows 10和任何子编号将摆脱所有这些警告。
如果有人关注了微软的网页,这也无济于事
你需要写的vb net

<Assembly: System.Runtime.Versioning.SupportedOSPlatform("windows")>

但我没有测试过

相关问题