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\n
CA1416
“此调用站点可在所有平台上访问。\'SomeClass.SomeMethod\' 仅在以下平台上受支持:\'windows\'。
请参阅下面的屏幕截图了解一些示例:
\n\n从某种意义上说,VS2022 扫描了库并找到了我在库中使用的所有平台特定代码,这很酷。但我想告诉 VS,我只打算在 Windows 上使用该库,它可以消除所有这些警告。
\n首先,我检查了Target framework
项目属性中的选项,但没有看到任何 Windows 特定目标。
然后我决定直接编辑项目.csproj
并更改Target framework
<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
作为实际文件维护的,而不是在构建时自动生成的。
因此,此时,我已准备好踢球并禁用CA1416
我的项目的警告。因此,在项目的.proj
文件中,我添加了CA1416
发布和调试版本,如下所示:
<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)
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
.
他们的建议如下:
要将这些 API 用于跨平台应用程序,请迁移到以下库之一:
- 图像锐利
- [SkiaSharp][2]
- [微软.毛伊岛.图形][3]
或者,您可以通过在 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
为将修复警告的项目。
来源:
解决此问题的一种方法是为解决方案创建一个 .editorconfig,然后将以下行添加到该 .editorconfig 文件中:
dotnet_diagnostic.CA1416.severity = none
这将使所有“验证平台兼容性”警告消失。
归档时间: |
|
查看次数: |
25678 次 |
最近记录: |