首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复VisualStudio2022警告CA1416“所有平台都可以访问的呼叫站点”但“只支持:'windows'"?

如何修复VisualStudio2022警告CA1416“所有平台都可以访问的呼叫站点”但“只支持:'windows'"?
EN

Stack Overflow用户
提问于 2021-11-11 23:14:47
回答 4查看 8.1K关注 0票数 23

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

CA1416”此呼叫站点可在所有平台上访问。'SomeClass.SomeMethod‘仅支持在:'windows’上。

有关一些示例,请参见下面的屏幕截图:

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

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

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

代码语言:javascript
运行
复制
<TargetFramework>net6.0</TargetFramework>

代码语言:javascript
运行
复制
<TargetFramework>net6.0-windows</TargetFramework>

但是,不幸的是,即使在重新编译之后,这也没有使警告消失。因此,我对CA1416警告做了一些解读,并在Microsoft中肯定地指出,在评估此警告时,目标框架名称被忽略,但是VS确实根据影响该警告的TFM向项目添加了一个属性,但只有在项目配置为动态生成AssemblyInfo.cs文件时才会这样做。但是,唉,我的项目的AssemblyInfo.cs被维护为一个实际的文件,而不是让它在构建时自动生成。

因此,在这一点上,我准备抛出球,并禁用我的项目的CA1416警告。因此,在项目的.proj文件中,我为发行版和调试版本添加了CA1416,如下所示:

代码语言:javascript
运行
复制
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <NoWarn>1701;1702;CA1416;</NoWarn>
</PropertyGroup>

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

人们可能会认为,这将是那些令人讨厌的警告的结束。(叹息)事实证明,在重建项目之后,仍然会出现警告。有什么建议吗?我在认真地听呢。

EN

Stack Overflow用户

回答已采纳

发布于 2021-12-08 09:23:07

更新:

在我们的一位开发人员试图用Visual Studio 2022 for Mac Preview 1在他的苹果电脑上启动解决方案之前,针对Windows的效果很好。

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用于跨平台应用程序,请迁移到以下库之一:

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

代码语言:javascript
运行
复制
{
   "runtimeOptions": {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
   }
}

增加这个配置开关是为了让跨平台应用程序在很大程度上依赖于这个包来迁移到更现代的库。然而,非Windows错误将不会被修复。此外,我们可能在将来的版本中完全删除对非Windows平台的支持,即使您使用运行时配置开关启用它。 备注 尽管运行时开关名为System.Drawing.EnableUnixSupport,但它适用于各种非Windows平台,如macOS和Android,这些平台通常被认为是Unix的风格。

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

一开始看起来很有希望,但后来我在他们的IImage Downsize方法中遇到了一个bug。

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

在此之前,我的临时解决方案是使用目标框架.NET 6、Target (无),然后使用Exclude specific warnings as errors,因为我们已经启用了Treat warnings as errors

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

代码语言:javascript
运行
复制
{
   "runtimeOptions": {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
   }
}

原版:

您可以使用dotnet_diagnostic.CA1416.severity = none来取消警告,但是imao如果您只打算在Windows上使用它,则应该将目标OS设置为项目的Windows,这将修复警告。

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

来源:

https://stackoverflow.com/a/70272543/3850405

票数 8
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69936093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档