Проверка сборки

Аналогично проверке пакетов, средство проверки сборки позволяет, как разработчик библиотеки, проверить, что сборки согласованы и хорошо сформированы. Используйте проверку сборки вместо проверки пакета, если приложение не упаковывается.

Проверка сборки предоставляет следующие проверка:

  • Проверяет, что в разных версиях нет критических изменений.
  • Проверяет, что сборка имеет один и тот же набор общедоступных API для всех различных реализаций, относящихся к среде выполнения.
  • Перехватывает все дыры применимости.

Проверку сборки можно выполнить как задачу MSBuild, так и с помощью глобального средства Microsoft.DotNet.ApiCompat.Tool.

Включение задачи MSBuild

Чтобы включить проверку сборки в проекте .NET, задайте ApiCompatValidateAssemblies свойство true и укажите путь к сборке контракта (базовой). Кроме того, необходимо добавить ссылку на пакет в Microsoft.DotNet.ApiCompat.Task. (Файлы targets в этом пакете не являются частью пакета SDK для .NET.)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net8.0</TargetFrameworks>
    <ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
    <ApiCompatContractAssembly>[Path to contract assembly]</ApiCompatContractAssembly>
    <IsPackable>false</IsPackable>
  </PropertyGroup>

  <ItemGroup Condition="'$(ApiCompatValidateAssemblies)' == 'true'">
    <PackageReference Include="Microsoft.DotNet.ApiCompat.Task" Version="8.0.100" PrivateAssets="all" IsImplicitlyDefined="true" />
  </ItemGroup>

</Project>

Проверка сборки выполняется либо во внешней сборке для проектов с несколькими целевыми объектами (после DispatchToInnerBuilds целевого объекта), либо во внутренней сборке для проекта с одним целевым объектом (в рамках целевого PrepareForRun объекта). Он также полностью добавочный, то есть сравнение активируется только в том случае, если входные или выходные данные изменились.

Пример

  1. Создайте и создайте библиотеку классов C# с именем ValidateMe, которая содержит следующий простой интерфейс:

    namespace ValidateMe;
    
    public interface IAnimal
    {
        string Name { get; }
        //string Sound { get; }
    }
    
  2. Переименуйте выходную сборку на "ValidateMeV1.dll".

  3. Добавьте свойство в Sound интерфейс, раскомментируя такую строку кода.

  4. ApiCompatValidateAssemblies Добавьте в файл проекта ссылку на ApiCompatContractAssembly пакет Microsoft.DotNet.ApiCompat.Task и свойства. Также увеличьте версию сборки до версии 2.0.0.

    <PropertyGroup>
      <OutputType>Library</OutputType>
      <TargetFrameworks>net8.0</TargetFrameworks>
      <ApiCompatValidateAssemblies>true</ApiCompatValidateAssemblies>
      <ApiCompatContractAssembly>$(OutDir)bin\Release\net8.0\ValidateMeV1.dll</ApiCompatContractAssembly>
      <IsPackable>false</IsPackable>
      <Version>2.0.0</Version>
    </PropertyGroup>
    
    <ItemGroup Condition="'$(ApiCompatValidateAssemblies)' == 'true'">
       <PackageReference Include="Microsoft.DotNet.ApiCompat.Task" Version="8.0.100" PrivateAssets="all" IsImplicitlyDefined="true" />
    </ItemGroup>
    
  5. Перестройте библиотеку классов.

    Сборка завершается сбоем со следующими ошибками:

    C:\Users\me\.nuget\packages\microsoft.dotnet.apicompat.task\8.0.100\build\Microsoft.DotNet.ApiCompat.ValidateAssemblies.Common.targets(16,5): error : API compatibility errors between 'bin\Release\net8.0\ValidateMeV1.dll' (left) and 'C:\Users\me\source\repos\ValidateMe\bin\Release\net8.0\ValidateMe.dll' (right):
    1>C:\Users\me\.nuget\packages\microsoft.dotnet.apicompat.task\8.0.100\build\Microsoft.DotNet.ApiCompat.ValidateAssemblies.Common.targets(16,5): error CP0006: Cannot add interface member 'string ValidateMe.IAnimal.Sound' to C:\Users\me\source\repos\ValidateMe\bin\Release\net8.0\ValidateMe.dll because it does not exist on bin\Release\net8.0\ValidateMeV1.dll
    1>C:\Users\me\.nuget\packages\microsoft.dotnet.apicompat.task\8.0.100\build\Microsoft.DotNet.ApiCompat.ValidateAssemblies.Common.targets(16,5): error : API breaking changes found. If those are intentional, the APICompat suppression file can be updated by rebuilding with '/p:ApiCompatGenerateSuppressionFile=true'
    

Подавление предупреждений о совместимости

Сведения о подавлении предупреждений совместимости см. в разделе "Как отключить".