包/程序集验证错误代码

本参考文章列出了包验证和程序集验证生成的所有错误代码。

错误代码列表

诊断标识符 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 关键字添加回去。 如果成员以前是抽象成员,请将virtualabstract关键字添加到该成员中。
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:

阻止文件

若要取消有意更改的兼容性错误,请将 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>