本参考文章列出了包验证和程序集验证生成的所有错误代码。
错误代码列表
| 诊断标识符 | Description | 建议的措施 |
|---|---|---|
| PKV001 | 缺少兼容框架的编译时资产。 | 将相应的目标框架添加到项目。 |
| PKV002 | 缺少兼容框架和运行时的运行时资源。 | 将相应的运行时资产添加到包中。 |
| PKV003 | 缺少兼容框架的运行时独立资产。 | 将适当的独立于运行时的目标框架添加到项目。 |
| PKV004 | 缺失了与编译时资产兼容的运行时的资产。 | 将适当的运行时资产添加到包。 |
| PKV005 | 缺少用于编译时资产和支持的运行时标识符的兼容运行时资产。 | 将适当的运行时资产添加到包。 |
| PKV006 | 目标框架在最新版本中被删除。 | 将相应的目标框架添加到项目。 |
| PKV007 | 目标框架和运行时标识符对在最新版本中被删除。 | 将相应的目标框架和 RID 添加到项目。 |
| CP0001 | 当需要存在时,比较程序集中缺少程序集之外的类型、枚举、记录或结构。 | 将缺少的类型添加到缺少它的程序集。 |
| CP0002 | 当需要存在时,比较程序集中缺少程序集外部可见的成员。 | 将缺少的成员添加到缺少它的程序集。 |
| CP0003 | 程序集标识的某些部分(名称、公钥令牌、区域性、可重定向属性或版本)在比较双方不匹配。 | 更新程序集标识,以使两者一致。 |
| CP0004 | 在创建程序集映射时,在比较的一端找不到匹配的程序集。 | 确保缺少的程序集已添加到包中。 |
| CP0005 | 与未封装类型比较时,成员 abstract 被添加到了右侧。 |
删除成员或不要将其标记为 abstract。 |
| CP0006 | 一个成员已添加到没有默认实现的接口中。 | 如果目标框架和语言版本支持默认实现,请添加一个或只是从接口中删除成员。 |
| CP0007 | 类层次结构上的基类型已从其中一个比较端中删除。 | 将基类型添加回去。 (如果预期,可以在层次结构中引入新的基类型。 |
| CP0008 | 基接口已从其中一个比较端的接口层次结构中删除。 | 将接口添加回层次结构。 |
| CP0009 | 一侧未封闭的类型在另一比较的端被标注为 sealed。 |
删除类型中的sealed批注。 |
| CP0010 | 枚举的基础类型已从一种类型变更为另一种类型。 | 将基础类型更改回以前的类型。 |
| CP0011 | 枚举中成员的值已从一个值更改为另一个值。 | 将成员的值更改回之前的值。 |
| CP0012 |
virtual 关键字或 abstract 关键字已从以前是虚拟或抽象的成员中删除。 |
如果成员以前是虚拟成员,请将 virtual 关键字添加回去。 如果成员以前是抽象成员,请将virtual或abstract关键字添加到该成员中。 |
| CP0013 | 该 virtual 关键字已添加到以前不是虚拟的成员。 |
从成员中删除virtual关键字。 |
| CP0014 | 属性已从以前拥有该属性的成员中删除。 | 将属性重新添加到成员。 |
| CP0015 | 传递给属性的参数从一侧更改为另一侧。 | 将参数改回到它们之前的状态。 |
| CP0016 | 已将属性添加到以前没有该属性的成员。 | 从成员中删除属性。 |
| CP0017 | 方法参数的名称已从一边更改到另一边。 | 将参数的名称更改回以前的名称。 |
| CP0018 |
sealed 关键字被添加到以前未密封的接口成员中。 |
删除接口成员中的sealed关键字。 |
| CP0019 | 成员的可视性从一侧降低到了另一侧。 | 将成员的可见性更改回以前的状态。 |
| CP0020 | 成员的可见性已从一侧扩展到另一侧。 | 将成员的可见性更改回先前的状态。 |
| CP1001 | 在搜索目录中找不到匹配的程序集。 (不适用于包验证,仅适用于直接使用 API Compat 时)。 | 加载匹配程序集时通过 AssemblySymbolLoader 提供搜索目录。 |
| CP1002 | 加载程序集时找不到引用程序集,以便在当前目标框架的已解析目录中进行比较。 | 请使用以下 MSBuild 项来包含该程序集所在的目录路径:<PackageValidationReferencePath Include="<path>" TargetFramework="<tfm>" />. |
| CP1003 | 没有为目标框架标识符提供搜索目录,该包验证正在为其运行 API Compat。 | 提供搜索目录以使用以下 MSBuild 项查找该目标框架的引用: <PackageValidationReferencePath Include="<path>" TargetFramework="<tfm>" /> |
如何隐藏
可以通过以下任一方式取消单个诊断 ID:
- 通过 抑制文件。
-
NoWarn通过编译器标志。
阻止文件
若要取消有意更改的兼容性错误,请将 CompatibilitySuppressions.xml 文件添加到项目中。 包验证和程序集验证使用相同的抑制文件格式。
可以通过以下两种方式之一自动生成此文件:
- 在从命令行打包项目时,传递
/p:GenerateCompatibilitySuppressionFile=true。 - 通过将以下属性添加到项目文件:
<GenerateCompatibilitySuppressionFile>true</GenerateCompatibilitySuppressionFile>
屏蔽文件如下所示。
<?xml version="1.0" encoding="utf-8"?>
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:A.B.DoStringManipulation(System.String)</Target>
<Left>lib/netstandard2.0/A.dll</Left>
<Right>lib/net6.0/A.dll</Right>
<IsBaselineSuppression>false</IsBaselineSuppression>
</Suppression>
</Suppressions>
-
DiagnosticId指定要禁止显示的错误的 ID 。 -
Target指定代码中禁止显示诊断 ID 的位置。 -
Left指定 APICompat 比较的左作数。 -
Right指定 APICompat 比较的右作数。 -
IsBaselineSuppression指定抑制是否应用于基线验证(true)或者不应用(false)。
NoWarn 编译器选项
您还可以通过编译器标志在每个包或全局范围内取消单个诊断 ID。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<!-- The following NoWarn suppresses PKV001 project-wide -->
<NoWarn>$(NoWarn);PKV001</NoWarn>
</PropertyGroup>
</Project>