包/程序集验证错误代码

本文仅供参考,其中列出了由包验证和程序集验证生成的所有错误代码。

错误代码列表

诊断 ID 说明 建议的操作
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 关键字。 virtual 关键字添加回成员。
CP0013 向以前不是虚拟成员的成员添加了 virtual 关键字。 从该成员中删除 virtual 关键字。
CP0014 已从成员删除一个属性,该成员之前具有该属性。 将该属性添加回该成员。
CP0015 传递给属性的参数从一方更改为另一方。 将属性的参数更改回之前的值。
CP0016 已向成员添加一个属性,该成员之前没有该属性。 从该成员删除该属性。
CP0017 一个方法参数的名称在一端已更改为其他名称。 将参数的名称更改回它以前的名称。
CP0018 已向之前未密封的接口成员添加 sealed 关键字。 从接口成员删除 sealed 关键字。
CP0019 成员可见性从一侧到另一侧逐渐降低。 将成员的可见性更改回以前的值。
CP0020 成员可见性从一侧到另一侧逐渐提高。 将成员的可见性更改回以前的值。
CP1001 在搜索目录中找不到匹配的程序集。 (仅当直接使用 API 兼容性时适用,不适用于包验证。) 当使用 AssemblySymbolLoader 加载匹配程序集时,提供搜索目录。
CP1002 在当前目标框架的解析目录中加载要比较的程序集时,找不到引用程序集。 使用以下 MSBuild 项添加可在其中找到该程序集的目录路径:<PackageValidationReferencePath Include="<path>" TargetFramework="<tfm>" />
CP1003 没有为包验证正在为其运行 API 兼容性的目标框架名字对象提供任何搜索目录。 使用以下 MSBuild 项提供搜索目录,以查找该目标框架的引用:<PackageValidationReferencePath Include="<path>" TargetFramework="<tfm>" />

如何禁止显示

可以通过以下任一方式禁止显示单个诊断 ID:

禁止显示文件

若要抑制有意更改的兼容性错误,请将 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 编译器选项

还可以通过 NoWarn 编译器标志禁止显示单个诊断 ID(每个包或全局)。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    ...
    <!-- The following NoWarn suppresses PKV001 project-wide -->
    <NoWarn>$(NoWarn);PKV001</NoWarn>
  </PropertyGroup>
</Project>