Share via


Assemblyvalidatie

Net als bij pakketvalidatie kunt u als bibliotheekontwikkelaar controleren of uw assembly's consistent en goed zijn gevormd. Gebruik assemblyvalidatie in plaats van pakketvalidatie wanneer uw app niet kan worden verpakt.

Assemblyvalidatie biedt de volgende controles:

  • Valideert dat er geen wijzigingen zijn die fouten veroorzaken in verschillende versies.
  • Valideert dat de assembly dezelfde set openbare API's heeft voor alle verschillende runtimespecifieke implementaties.
  • Eventuele toepasselijkheidsgaten worden onderschept.

U kunt assemblyvalidatie uitvoeren als een MSBuild-taak of met het globale hulpprogramma Microsoft.DotNet.ApiCompat.Tool.

MSBuild-taak inschakelen

U schakelt assemblyvalidatie in uw .NET-project in door de ApiCompatValidateAssemblies eigenschap in te true stellen op het pad naar de contractassembly (basislijn). U moet ook een pakketreferentie toevoegen aan Microsoft.DotNet.ApiCompat.Task. (De targets bestanden in dat pakket maken geen deel uit van de .NET SDK.)

<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>

Assemblyvalidatie wordt uitgevoerd in de buitenste build voor projecten met meerdere doelen (na het DispatchToInnerBuilds doel) of in de binnenste build voor een project met één doel (als onderdeel van het PrepareForRun doel). Het is ook volledig incrementeel, wat betekent dat de vergelijking alleen wordt geactiveerd als de invoer of uitvoer is gewijzigd.

Opmerking

  1. Maak en bouw een C#-klassebibliotheek met de naam 'ValidateMe' die de volgende eenvoudige interface bevat:

    namespace ValidateMe;
    
    public interface IAnimal
    {
        string Name { get; }
        //string Sound { get; }
    }
    
  2. Wijzig de naam van de uitvoerassembly in 'ValidateMeV1.dll'.

  3. Voeg de Sound eigenschap toe aan de interface door de commentaarregel van die coderegel op te heffen.

  4. Voeg de ApiCompatValidateAssemblies en eigenschappen en ApiCompatContractAssembly de pakketreferentie Microsoft.DotNet.ApiCompat.Task toe aan uw projectbestand. Verhoog ook de versie van uw assembly naar 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. Bouw de klasbibliotheek opnieuw.

    De build mislukt met de volgende fouten:

    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'
    

Compatibiliteitswaarschuwingen onderdrukken

Zie Hoe u compatibiliteitswaarschuwingen onderdrukt voor informatie over het onderdrukken van compatibiliteitswaarschuwingen.