어셈블리 유효성 검사

패키지 유효성 검사와 마찬가지로 어셈블리 유효성 검사 도구를 사용하면 라이브러리 개발자로서 어셈블리가 일관되고 잘 구성되어 있는지 확인할 수 있습니다. 앱을 압축할 수 없는 경우 패키지 유효성 검사 대신 어셈블리 유효성 검사를 사용합니다.

어셈블리 유효성 검사는 다음과 같은 검사를 제공합니다.

  • 버전 간에 호환성이 손상되는 변경이 없는지 확인합니다.
  • 어셈블리에 서로 다른 모든 런타임 특정 구현에 대해 동일한 공용 API 집합이 있는지 확인합니다.
  • 적용 가능성 빈 영역을 포착합니다.

MSBuild 작업 또는 Microsoft.DotNet.ApiCompat.Tool 전역 도구를 사용하여 어셈블리 유효성 검사를 실행할 수 있습니다.

MSBuild 사용

속성을 true 설정하여 계약(기준) 어셈블리의 경로를 지정하여 ApiCompatValidateAssemblies .NET 프로젝트에서 어셈블리 유효성 검사를 사용하도록 설정합니다. Microsoft.DotNet.ApiCompat.Task 패키지 참조도 추가해야 합니다. (해당 패키지의 targets 파일은 .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>

어셈블리 유효성 검사는 다중 대상 프로젝트에 대한 외부 빌드( DispatchToInnerBuilds 대상 이후) 또는 단일 대상 프로젝트에 대한 내부 빌드에서 실행됩니다( PrepareForRun 대상의 일부로). 또한 완전히 증분되므로 입력 또는 출력이 변경된 경우에만 비교가 트리거됩니다.

예시

  1. 다음 간단한 인터페이스를 포함하는 "ValidateMe"라는 C# 클래스 라이브러리를 만들고 빌드합니다.

    namespace ValidateMe;
    
    public interface IAnimal
    {
        string Name { get; }
        //string Sound { get; }
    }
    
  2. 출력 어셈블리의 이름을 "ValidateMeV1.dll"로 바꿉니다.

  3. 해당 코드 줄의 Sound 주석 처리를 제거하여 인터페이스에 속성을 추가합니다.

  4. ApiCompatValidateAssemblies 프로젝트 파일에 "Microsoft.DotNet.ApiCompat.Task" 패키지 참조 및 ApiCompatContractAssembly 속성을 추가합니다. 또한 어셈블리의 버전을 "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'
    

호환성 경고 표시 안 함

호환성 경고를 표시하지 않는 방법에 대한 자세한 내용은 표시하지 않는 방법을 참조하세요.