在了解旧版 FxCop(二进制分析)和 .NET 分析器(源分析)之间的区别时可能会产生混淆。 本文旨在解决你可能遇到的一些问题。
旧版 FxCop 和 .NET 分析器之间有什么区别?
旧版 FxCop 在已编译的程序集上运行生成后分析。 它作为单独的可执行文件运行,名为 FxCopCmd.exe。 FxCopCmd.exe 加载已编译的程序集,运行代码分析,然后报告结果(或“诊断”)。
.NET 分析器基于 .NET Compiler Platform(“Roslyn”)。 你可以从 .NET SDK 启用它们,或者将它们安装为 NuGet 包,该包为项目或解决方案所引用。 分析器在编译器执行期间运行基于源代码的分析。 分析器托管在编译器进程(csc.exe 或 vbc.exe)中,并在生成项目时运行分析。 报告分析器结果以及编译器结果。
FxCop 分析器和 .NET 分析器之间有什么区别?
FxCop 分析器和 .NET 分析器都是指 .NET Compiler Platform(“Roslyn”)对 FxCop CA 规则的分析器实现。 在 Visual Studio 2019 16.8 和 .NET 5.0 之前的版本中,这些分析器作为 Microsoft.CodeAnalysis.FxCopAnalyzers
NuGet 包提供。 从 Visual Studio 2019 16.8 和 .NET 5.0 开始,这些分析器包含在 .NET SDK 中。 它们也作为 Microsoft.CodeAnalysis.NetAnalyzers
NuGet 包提供。 请考虑从 FxCop 分析器迁移到 .NET 分析器。
“运行代码分析”命令是否运行 .NET 分析器?
在 Visual Studio 2019 16.5 版本之前,选择“分析”>“运行代码分析”时,它会执行旧式分析。 从 Visual Studio 2019 16.5 开始,“运行代码分析”菜单选项会针对所选项目或解决方案执行基于 Roslyn 的分析器。 如果已安装 .NET 分析器,也会执行这些分析器。 有关详细信息,请参阅如何:手动运行托管代码的代码分析。
RunCodeAnalysis msbuild 项目属性是否运行分析器?
不是。 项目文件(例如 .csproj)中的 RunCodeAnalysis 属性仅用于执行旧版 FxCop。 它将运行调用 FxCopCmd.exe 的生成后 msbuild 任务。
那么我该如何运行 .NET 分析器呢?
若要运行 .NET 分析器,请首先从 .NET SDK 启用它们,或将其安装为 NuGet 包。 然后在 Visual Studio 中或使用 msbuild 生成项目或解决方案。 Roslyn 分析器生成的警告和错误将显示在“错误列表”或命令窗口中。
即使在安装了 .NET 分析器 NuGet 包之后,我仍会收到 CA0507 警告
如果已安装 .NET 分析器,但继续收到“‘运行代码分析’已被弃用,以支持在生成期间运行的 FxCop 分析器”的 CA0507 警告,可能需要将项目文件中的“RunCodeAnalysis”msbuild 属性设置为“false”。 否则,每次生成后将执行旧式分析。
<RunCodeAnalysis>false</RunCodeAnalysis>
哪些规则已移植到 .NET 分析器中?
有关已移植到 .NET 分析器的旧分析规则的信息,请参阅 Fxcop 规则端口状态。
代码分析警告被视为错误
如果项目使用生成选项将警告视为错误,分析器警告可能会显示为错误。 要防止代码分析警告被视为错误,请执行代码分析 FAQ 中的步骤。