可以通过三种方式生成代码指标数据:
通过启用 .NET 代码质量分析器 并启用它所包含的四个代码指标(可维护性)规则。
通过在 Visual Studio 中选择 “分析>计算代码指标 ”菜单命令。
通过 C# 和 Visual Basic 项目的命令行。
.NET 代码质量分析器代码指标规则
.NET 代码质量分析器包括多个代码指标 分析器 规则:
默认情况下禁用这些规则,但可以从 解决方案资源管理器 或 EditorConfig 文件中启用这些规则。 例如,若要启用规则 CA1502 作为警告,EditorConfig 文件将包含以下条目:
dotnet_diagnostic.CA1502.severity = warning
配置
可以配置触发代码度量规则的阈值。
创建文本文件。 例如,可以 将其命名为CodeMetricsConfig.txt。
使用以下格式将所需阈值添加到文本文件:
CA1502: 10
在此示例中,规则 CA1502 配置为在方法的旋形复杂性大于 10 时触发。
在 Visual Studio 的“属性”窗口中或项目文件中,将配置文件的生成操作标记为“AdditionalFiles”。 例如:
<ItemGroup> <AdditionalFiles Include="CodeMetricsConfig.txt" /> </ItemGroup>
“计算代码指标”菜单命令
使用 “分析>计算代码指标 ”菜单为 IDE 中的一个或多个打开的项目生成代码指标。
生成整个解决方案的代码指标结果
可以通过以下任一方式为整个解决方案生成代码指标结果:
从菜单栏中,选择“分析>计算代码指标>对于解决方案”。
在 解决方案资源管理器中,右键单击该解决方案,然后选择“ 计算代码指标”。
在 “代码指标结果 ”窗口中,选择“ 计算解决方案代码指标 ”按钮。
生成结果并显示 “代码指标结果 ”窗口。 若要查看结果详细信息,请展开 “层次结构” 列中的树。
为一个或多个项目生成代码指标结果
在 解决方案资源管理器中,选择一个或多个项目。
从菜单栏中选择分析>计算代码度量>对于选定的项目。
生成结果并显示 “代码指标结果 ”窗口。 若要查看结果详细信息,请展开 层次结构中的树。
命令行代码指标
可以从适用于 .NET Framework、.NET Core 和 .NET Standard 应用的 C# 和 Visual Basic 项目的命令行生成代码指标数据。 若要从命令行运行代码指标,请安装 Microsoft.CodeAnalysis.Metrics NuGet 包 或自行生成 Metrics.exe 可执行文件。
Microsoft.CodeAnalysis.Metrics NuGet 包
从命令行生成代码指标数据的最简单方法是安装 Microsoft.CodeAnalysis.Metrics NuGet 包。 安装包后,从包含项目文件的目录运行 msbuild /t:Metrics
。 例如:
C:\source\repos\ClassLibrary3\ClassLibrary3>msbuild /t:Metrics
Microsoft (R) Build Engine version 16.0.360-preview+g9781d96883 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
Build started 1/22/2019 4:29:57 PM.
Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" on node 1 (Metrics target(s))
.
Metrics:
C:\source\repos\ClassLibrary3\packages\Microsoft.CodeMetrics.2.6.4-ci\build\\..\Metrics\Metrics.exe /project:C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj /out:ClassLibrary3.Metrics.xml
Loading ClassLibrary3.csproj...
Computing code metrics for ClassLibrary3.csproj...
Writing output to 'ClassLibrary3.Metrics.xml'...
Completed Successfully.
Done Building Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" (Metrics target(s)).
Build succeeded.
0 Warning(s)
0 Error(s)
可以通过指定 /p:MetricsOutputFile=<filename>
来替代输出文件名。 还可以通过指定来获取/p:LEGACY_CODE_METRICS_MODE=true
代码指标数据。 例如:
C:\source\repos\ClassLibrary3\ClassLibrary3>msbuild /t:Metrics /p:LEGACY_CODE_METRICS_MODE=true /p:MetricsOutputFile="Legacy.xml"
Microsoft (R) Build Engine version 16.0.360-preview+g9781d96883 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
Build started 1/22/2019 4:31:00 PM.
The "MetricsOutputFile" property is a global property, and cannot be modified.
Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" on node 1 (Metrics target(s))
.
Metrics:
C:\source\repos\ClassLibrary3\packages\Microsoft.CodeMetrics.2.6.4-ci\build\\..\Metrics.Legacy\Metrics.Legacy.exe /project:C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj /out:Legacy.xml
Loading ClassLibrary3.csproj...
Computing code metrics for ClassLibrary3.csproj...
Writing output to 'Legacy.xml'...
Completed Successfully.
Done Building Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" (Metrics target(s)).
Build succeeded.
0 Warning(s)
0 Error(s)
代码指标输出
生成的 XML 输出采用以下格式:
<?xml version="1.0" encoding="utf-8"?>
<CodeMetricsReport Version="1.0">
<Targets>
<Target Name="ConsoleApp20.csproj">
<Assembly Name="ConsoleApp20, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<Metrics>
<Metric Name="MaintainabilityIndex" Value="100" />
<Metric Name="CyclomaticComplexity" Value="1" />
<Metric Name="ClassCoupling" Value="1" />
<Metric Name="DepthOfInheritance" Value="1" />
<Metric Name="SourceLines" Value="11" />
<Metric Name="ExecutableLines" Value="1" />
</Metrics>
<Namespaces>
<Namespace Name="ConsoleApp20">
<Metrics>
<Metric Name="MaintainabilityIndex" Value="100" />
<Metric Name="CyclomaticComplexity" Value="1" />
<Metric Name="ClassCoupling" Value="1" />
<Metric Name="DepthOfInheritance" Value="1" />
<Metric Name="SourceLines" Value="11" />
<Metric Name="ExecutableLines" Value="1" />
</Metrics>
<Types>
<NamedType Name="Program">
<Metrics>
<Metric Name="MaintainabilityIndex" Value="100" />
<Metric Name="CyclomaticComplexity" Value="1" />
<Metric Name="ClassCoupling" Value="1" />
<Metric Name="DepthOfInheritance" Value="1" />
<Metric Name="SourceLines" Value="7" />
<Metric Name="ExecutableLines" Value="1" />
</Metrics>
<Members>
<Method Name="void Program.Main(string[] args)" File="C:\source\repos\ConsoleApp20\ConsoleApp20\Program.cs" Line="7">
<Metrics>
<Metric Name="MaintainabilityIndex" Value="100" />
<Metric Name="CyclomaticComplexity" Value="1" />
<Metric Name="ClassCoupling" Value="1" />
<Metric Name="SourceLines" Value="4" />
<Metric Name="ExecutableLines" Value="1" />
</Metrics>
</Method>
</Members>
</NamedType>
</Types>
</Namespace>
</Namespaces>
</Assembly>
</Target>
</Targets>
</CodeMetricsReport>
Metrics.exe
如果不想安装 NuGet 包,可以直接生成和使用 Metrics.exe 可执行文件。 生成 Metrics.exe 可执行文件:
克隆 dotnet/roslyn-analyzers 存储库。
以管理员身份打开 Visual Studio 开发人员命令提示符。
从 roslyn 分析器 存储库的根目录执行以下命令:
Restore.cmd
将目录更改为 src\Tools\Metrics。
执行以下命令生成 Metrics.csproj 项目:
msbuild /m /v:m /p:Configuration=Release Metrics.csproj
名为 Metrics.exe 的可执行文件在存储库根下的 artifacts\bin 目录中生成。
Metrics.exe 用法
若要运行 Metrics.exe,请提供项目或解决方案和输出 XML 文件作为参数。 例如:
C:\>Metrics.exe /project:ConsoleApp20.csproj /out:report.xml
Loading ConsoleApp20.csproj...
Computing code metrics for ConsoleApp20.csproj...
Writing output to 'report.xml'...
Completed Successfully.
旧模式
可以选择在旧模式下生成 Metrics.exe。 该工具的旧模式版本生成的指标值更接近旧版工具生成的指标值。 此外,在旧模式下,Metrics.exe 会为与旧版工具相同的一组方法类型生成代码指标。 例如,它不会为字段和属性初始化生成代码度量数据。 旧模式可用于保持向后兼容性,或者如果你有基于代码指标数字的代码签入入口,旧模式也很有用。 在旧模式下生成 Metrics.exe 的命令为:
msbuild /m /v:m /t:rebuild /p:LEGACY_CODE_METRICS_MODE=true Metrics.csproj
有关详细信息,请参阅 启用在传统模式下生成代码指标。
以前的版本
Visual Studio 2015 包含一个命令行代码指标工具,该工具也称为 Metrics.exe。 该工具的早期版本执行了二进制分析,即基于程序集的分析。 Metrics.exe 工具的较新版本改为分析源代码。 由于较新的 Metrics.exe 工具是基于源代码的,因此命令行代码指标结果可能与 Visual Studio IDE 和早期版本的 Metrics.exe生成的指标不同。 从 Visual Studio 2019 开始,Visual Studio IDE 会分析源代码,如命令行工具,结果应相同。
即使存在源代码错误,新的命令行代码指标工具也会计算指标,只要可以加载解决方案和项目。
指标值差异
从 Visual Studio 2019 版本 16.4 和 Microsoft.CodeAnalysis.Metrics (2.9.5)开始, SourceLines
并 ExecutableLines
替换以前的 LinesOfCode
指标。 有关新指标的说明,请参阅 代码指标值。 指标 LinesOfCode
在旧模式下可用。
其他指标,例如 CyclomaticComplexity
和 MaintainabilityIndex
,使用与 Metrics.exe 以前版本相同的公式,但新工具计算的是 IOperations
(逻辑源指令)的数量,而不是中间语言(IL)指令的数量。 这些数字与 Visual Studio IDE 和以前版本的 Metrics.exe生成的数字略有不同。