다음을 통해 공유


호환되는 프레임워크 유효성 검사

호환되는 프레임워크를 포함하는 패키지의 경우 하나의 프레임워크에 대해 컴파일된 코드가 다른 프레임워크에 대해 실행되는지 확인해야 합니다. 호환되는 프레임워크 쌍의 예는 다음과 같습니다.

  • .NET Standard 2.0과 .NET 7
  • .NET 6과 .NET 7

두 경우 모두 소비자가 .NET Standard 2.0 또는 .NET 6에 대해 빌드하고 .NET 7에서 실행할 수 있습니다. 이진 파일이 두 프레임워크에서 호환되지 않을 경우 소비자에게 컴파일 시간 또는 런타임 오류가 발생합니다.

패키지 유효성 검사는 패키징 시점에 이러한 오류를 catch합니다. 다음은 예제 시나리오입니다.

문자열을 조작하는 게임을 작성하고 있다고 가정하겠습니다. .NET Framework 소비자와 .NET(.NET Core) 소비자를 모두 지원해야 합니다. 원래는 프로젝트가 .NET Standard 2.0을 대상으로 하지만, 이번에는 불필요한 문자열 할당을 방지하기 위해 .NET 6의 Span<T>를 사용하려고 합니다. 이렇게 하려면 .NET Standard 2.0과 .NET 6을 다중 대상으로 지정해야 합니다.

아래와 같은 코드를 작성했습니다.

#if NET6_0_OR_GREATER
    public void DoStringManipulation(ReadOnlySpan<char> input)
    {
        // use spans to do string operations.
    }
#else
    public void DoStringManipulation(string input)
    {
        // Do some string operations.
    }
#endif

그런 다음 dotnet pack 또는 Visual Studio를 사용하여 프로젝트를 패키징합니다. 그런데 다음과 같은 오류가 발생하고 패키징이 실패합니다.

D:\demo>dotnet pack
Microsoft (R) Build Engine version 17.0.0-preview-21460-01+8f208e609 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
  You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
  PackageValidationThrough -> D:\demo\bin\Debug\netstandard2.0\PackageValidationThrough.dll
  PackageValidationThrough -> D:\demo\bin\Debug\net6.0\PackageValidationThrough.dll
  Successfully created package 'D:\demo\bin\Debug\PackageValidationThrough.1.0.0.nupkg'.
C:\Program Files\dotnet\sdk\6.0.100-rc.1.21463.6\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Compatibility.Common.targets(32,5): error CP0002: Member 'A.B.DoStringManipulation(string)' exists on lib/netstandard2.0/PackageValidationThrough.dll but not on lib/net6.0/PackageValidationThrough.dll [D:\demo\PackageValidationThrough.csproj]

CompatibleFrameworks

.NET 6에 대해 DoStringManipulation(string)을 제외하는 대신 .NET 6에 대해 추가 DoStringManipulation(ReadOnlySpan<char>) 메서드를 제공하는 것이 맞겠다는 것을 알아냅니다.

#if NET6_0_OR_GREATER
    public void DoStringManipulation(ReadOnlySpan<char> input)
    {
        // use spans to do string operations.
    }
#endif
    public void DoStringManipulation(string input)
    {
        // Do some string operations.
    }

프로젝트를 다시 패키징해 보니 패키징이 성공합니다.

CompatibleFrameworksSuccessful

strict 모드

프로젝트 파일에서 EnableStrictModeForCompatibleFrameworksInPackage 속성을 설정하여 이 유효성 검사기에 대한 엄격한 모드를 사용하도록 설정할 수 있습니다. strict 모드를 설정하면 일부 규칙이 변경되고, 차이를 가져올 때 일부 규칙이 실행됩니다. 이는 양쪽 비교 대상의 표면 영역과 ID가 정확히 동일해야 하는 경우에 유용합니다. 자세한 내용은 strict 모드를 참조하세요.