面向 .NET Framework 的 SDK 样式项目中的 FXCOP 输出中缺少文件名和行号

File names and line numbers missing from FXCOP output in SDK-style project targeting .NET Framework

提问人:ZbynekZ 提问时间:6/8/2022 更新时间:6/13/2022 访问量:26

问:

我们在解决方案中大量使用 FXCOP 代码分析(“旧版”)。我们正在启用许多 Microsoft 规则,并且还编写了大量我们自己的 FXCOP 样式分析器,用于我们想要检查的代码方面。在“旧”风格的 Visual Studio C# 项目中,它运行得非常好,面向各种 .NET Framework 版本(当前为 4.7.2)。

但是,当将同一项目移植到新的“SDK 样式”格式,并通过使用 net472 使它面向 .NET Framework 4.7.2 时,并且我们通过添加 true 来启用代码分析,我们会遇到问题。我们的自定义 FXCOP 规则似乎仍然运行良好并输出其警告,但在“错误列表”窗口中,“文件”列下没有文件名,并且“行”列下始终有第 1 行。因此,我们可以看到警告消息,但不可能双击警告并找出与警告相关的源代码中的位置 - 这使得整个代码分析毫无用处。当我切换到“输出/构建”窗口时,我还可以逐行看到警告,但此处也缺少文件名/行号信息。

我知道以下事实:

  • Microsoft 已将其许多或全部 FXCOP 规则移植到 Roslyn(“.NET 分析器”),现在可以/应该使用它们。但是,我需要使用我们自己的规则,而不仅仅是 Microsoft 规则。从长远来看,将我们的规则重写为 Roslyn 可能是正确的解决方案,但在短期或中期,这将是一项艰巨的任务。

  • VS 中的 .NET Core 和 .NET Standard 项目不支持 FXCOP(旧版)分析(根据 https://learn.microsoft.com/en-us/visualstudio/code-quality/static-code-analysis-for-managed-code-overview?view=vs-2022 )。但是,正如我上面所述,我的项目不适用于 .NET Core 或 .NET Standard。它适用于 .NET Framework 4.7.2 - 问题似乎在于它是 SDK 样式。我之所以需要这种格式,是因为这是我随后将用于移植到 .NET Core/.NET 6+ 的格式。

msbuild fxcop-customrules

评论

0赞 mu88 6/9/2022
设置此属性时会发生什么情况?
0赞 ZbynekZ 6/9/2022
@mu88,谢谢你的提示。我现在试过了,但结果是一样的。
0赞 mu88 6/9/2022
那么我认为你别无选择,只能将你的东西迁移到 Roslyn 分析器

答:

0赞 ZbynekZ 6/13/2022 #1

我找到了该问题的部分解决方案。FxCopCmd(由此使用)不发出文件名和行号的原因是,默认情况下,在 SDK 样式项目中,PDB 文件格式设置为可移植。FxCopCmd 不了解可移植 PDB。解决方案是在 Visual Studio 项目属性中,将“调试符号”设置为“PDB 文件,当前平台”。.csproj 文件中的相应设置是

 <DebugType>full</DebugType>

进行此更改后,文件名和行号将显示在文本输出中,以及它们在“错误列表”中的列中,并且可以单击输出或错误列表中的警告,您将被带到源中的正确位置。

什么还不起作用:“抑制......”“错误列表”中的上下文菜单命令仍未显示。