사용할 .NET 버전 선택

이 문서에서는 버전을 선택하기 위해 .NET 도구, SDK 및 런타임에서 사용되는 정책에 대해 설명합니다. 이러한 정책은 지정된 버전을 사용하여 애플리케이션을 실행하고 개발자와 최종 사용자 모두의 머신을 쉽게 업그레이드할 수 있도록 하는 균형을 제공합니다. 해당 정책을 통해 수행할 수 있는 작업은 다음과 같습니다.

  • 보안 및 안정성 업데이트를 포함하여 .NET을 쉽고 효율적으로 배포합니다.
  • 대상 런타임과 독립적으로 최신 도구 및 명령을 사용합니다.

버전을 선택하는 경우 발생하는 상황은 다음과 같습니다.

이 문서의 나머지 부분에서는 이 네 가지 시나리오를 검토합니다.

SDK에서 설치된 최신 버전 사용

SDK 명령에는 dotnet newdotnet run이 포함됩니다. .NET CLI는 모든 dotnet 명령의 SDK 버전을 선택해야 합니다. 다음의 경우에도 기본적으로 머신에 설치된 최신 SDK를 사용합니다.

  • 프로젝트가 이전 버전의 .NET 런타임을 대상으로 하는 경우
  • 최신 버전의 .NET SDK가 미리 보기 버전인 경우

이전의 .NET 런타임 버전을 대상으로 하면서 최신 SDK 기능과 향상된 기능을 활용할 수 있습니다. 동일한 SDK 도구를 사용하여 .NET의 다른 런타임 버전을 대상으로 지정할 수 있습니다.

드물지만 경우에 따라 이전 버전의 SDK를 사용해야 할 수도 있습니다. 해당 버전은 global.json 파일에 지정합니다. "최신 버전 사용" 정책은 global.json 을 사용하여 설치된 최신 버전보다 이전의 .NET SDK 버전을 지정한다는 것을 의미합니다.

global.json 은 파일 계층 구조에서 원하는 위치에 배치할 수 있습니다. CLI는 검색된 첫 번째 global.json 의 프로젝트 디렉터리에서 위쪽 방향으로 검색합니다. 파일 시스템의 해당 위치에 따라 지정된 global.json 이 적용되는 프로젝트를 제어합니다. .NET CLI는 현재 작업 디렉터리에서 위쪽 경로로 반복적으로 탐색하면서 global.json 파일을 검색합니다. 검색된 첫 번째 global.json 파일에서 사용된 버전을 지정합니다. 해당 SDK 버전이 설치되어 있으면 이 버전이 사용됩니다. global.json 에 지정된 SDK를 찾을 수 없는 경우 .NET CLI에서는 일치 규칙을 사용하여 호환되는 SDK를 선택하며, 아무것도 찾을 수 없는 경우 실패합니다.

다음 예제에서는 global.json 구문을 보여 줍니다.

{
  "sdk": {
    "version": "5.0.0"
  }
}

SDK 버전을 선택하는 프로세스는 다음과 같습니다.

  1. dotnet은 현재 작업 디렉터리에서 위쪽 경로로의 역방향으로 반복하여 탐색하면서 global.json 파일을 검색합니다.
  2. dotnet은 검색된 첫 번째 global.json 에 지정된 SDK를 사용합니다.
  3. global.json 이 없으면 dotnet에서 설치된 최신 SDK를 사용합니다.

SDK 버전 선택에 대한 자세한 내용은 global.json 개요 문서의 일치 규칙rollForward 섹션을 참조하세요.

대상 프레임워크 모니커에서 빌드 시간 API 정의

TFM(대상 프레임워크 모니커)에 정의된 API에 대해 프로젝트를 빌드합니다. 프로젝트 파일에서 대상 프레임워크를 지정합니다. 다음 예제와 같이 프로젝트 파일에서 TargetFramework 요소를 설정합니다.

<TargetFramework>net5.0</TargetFramework>

여러 개의 TFM에 대해 프로젝트를 구축할 수 있습니다. 여러 대상 프레임워크를 설정하는 것은 라이브러리에서 더 일반적이지만, 애플리케이션에서도 수행할 수 있습니다. TargetFrameworks 속성(TargetFramework의 복수형)을 지정합니다. 대상 프레임워크는 다음 예제와 같이 세미콜론으로 구분됩니다.

<TargetFrameworks>net5.0;netcoreapp3.1;net47</TargetFrameworks>

지정된 SDK는 함께 제공되는 런타임의 대상 프레임워크로 제한된 프레임워크의 고정된 집합을 지원합니다. 예를 들어 .NET 5.0 SDK에는 net5.0 대상 프레임워크의 구현인 .NET 5.0 런타임이 포함되어 있습니다. .NET 5.0 SDK는 netcoreapp2.0, netcoreapp2.1, netcoreapp3.0 등을 지원하지만 net6.0 이상은 지원하지 않습니다. net6.0용으로 빌드하려면 .NET 6.0 SDK를 설치합니다.

.NET Standard

.NET Standard는 여러 .NET 구현에서 공유하는 API 표면을 대상으로 지정하는 방법이었습니다. API 표준 자체인 .NET 5 릴리스부터 .NET Standard는 한 가지 시나리오를 제외하고는 거의 관련성이 없습니다. 해당 시나리오는 .NET과 .NET Framework 모두를 대상으로 지정하려는 경우에 .NET Standard가 유용하다는 것입니다. .NET 5는 모든 .NET Standard 버전을 구현합니다.

자세한 내용은 .NET 5 및 .NET Standard를 참조하세요.

프레임워크 종속 앱 롤포워드

dotnet run를 사용하여 소스에서, dotnet myapp.dll을 사용하여 프레임워크 종속 배포에서 또는 myapp.exe를 사용하여 프레임워크 종속 실행 파일에서 애플리케이션을 실행하는 경우 dotnet 실행 파일이 애플리케이션의 호스트 입니다.

호스트는 머신에 설치된 최신 패치 버전을 선택합니다. 예를 들어 프로젝트 파일에서 net5.0을 지정하고 5.0.2가 설치된 최신 .NET 런타임인 경우 5.0.2 런타임이 사용됩니다.

허용되는 5.0.* 버전이 없으면 새 5.* 버전이 사용됩니다. 예를 들어 net5.0을 지정하고 5.1.0만 설치된 경우 5.1.0 런타임을 사용하여 애플리케이션이 실행됩니다. 이 동작을 "부 버전 롤포워드"라고 합니다. 또한 더 낮은 버전은 고려되지 않습니다. 허용 가능한 런타임이 설치되어 있지 않으면 애플리케이션이 실행되지 않습니다.

5.0을 대상으로 하는 경우 몇 가지 사용 예제에서 동작을 보여 줍니다.

  • ✔️ 5.0이 지정되었습니다. 5.0.3이 설치된 가장 높은 패치 버전입니다. 5.0.3이 사용됩니다.
  • ❌ 5.0이 지정되었습니다. 5.0.* 버전이 설치되어 있지 않습니다. 3.1.1이 설치된 가장 높은 런타임 버전입니다. 오류 메시지가 표시됩니다.
  • ✔️ 5.0이 지정되었습니다. 5.0.* 버전이 설치되어 있지 않습니다. 5.1.0이 설치된 가장 높은 런타임 버전입니다. 5.1.0이 사용됩니다.
  • ❌ 3.0이 지정되었습니다. 3.x 버전이 설치되어 있지 않습니다. 5.0.0이 설치된 가장 높은 런타임 버전입니다. 오류 메시지가 표시됩니다.

부 버전 롤포워드에는 최종 사용자에게 영향을 줄 수 있는 하나의 부작용이 있습니다. 다음 시나리오를 고려하세요.

  1. 애플리케이션은 5.0이 필요하도록 지정합니다.
  2. 실행하면 5.0.* 버전은 설치되어 있지 않지만 5.1.0은 설치되어 있습니다. 버전 5.1.0이 사용됩니다.
  3. 나중에 사용자가 5.0.3을 설치하고 애플리케이션을 다시 실행하면 5.0.3이 사용됩니다.

5.0.3과 5.1.0은 다르게 작동할 수 있습니다. 특히 이진 데이터를 직렬화하는 것과 같은 시나리오에서는 더욱 그렇습니다.

롤포워드 동작 제어

애플리케이션의 롤포워드 동작은 다음과 같은 네 가지 방법으로 구성할 수 있습니다.

  1. <RollForward> 속성을 설정하여 프로젝트 수준 설정:

    <PropertyGroup>
      <RollForward>LatestMinor</RollForward>
    </PropertyGroup>
    
  2. *.runtimeconfig.json 파일

    이 파일은 애플리케이션을 컴파일할 때 생성됩니다. <RollForward> 속성이 프로젝트에서 설정된 경우 *.runtimeconfig.json 파일에서 rollForward 설정으로 재현됩니다. 사용자는 이 파일을 편집하여 애플리케이션의 동작을 변경할 수 있습니다.

    {
      "runtimeOptions": {
        "tfm": "net5.0",
        "rollForward": "LatestMinor",
        "framework": {
          "name": "Microsoft.NETCore.App",
          "version": "5.0.0"
        }
      }
    }
    
  3. dotnet 명령의 --roll-forward <value> 속성

    애플리케이션을 실행할 때 명령줄을 통해 롤포워드 동작을 제어할 수 있습니다.

    dotnet run --roll-forward LatestMinor
    dotnet myapp.dll --roll-forward LatestMinor
    myapp.exe --roll-forward LatestMinor
    
  4. DOTNET_ROLL_FORWARD 환경 변수

우선 순위

롤포워드 동작은 앱이 실행될 때 다음 순서로 설정되어 더 높은 번호가 매겨진 항목이 더 낮은 번호가 매겨진 항목보다 우선합니다.

  1. 먼저, *.runtimeconfig.json 구성 파일이 평가됩니다.
  2. 다음으로, DOTNET_ROLL_FORWARD 환경 변수가 고려되어 이전 검사를 재정의합니다.
  3. 마지막으로, 실행 중인 애플리케이션에 전달된 모든 --roll-forward 매개 변수가 그 밖의 모든 항목을 재정의합니다.

그러나 롤포워드 설정을 지정하려면 다음 값 중 하나를 사용하여 동작을 설정합니다.

Description
Minor 지정되지 않은 경우 기본값 입니다.
요청된 부 버전이 없을 경우 가장 낮은 더 높은 부 버전으로 롤포워드합니다. 요청된 부 버전이 있으면 LatestPatch 정책이 사용됩니다.
Major 요청된 주 버전이 없을 경우 다음으로 사용 가능한 더 높은 주 버전과 가장 낮은 부 버전으로 롤포워드합니다. 요청된 주 버전이 있으면 Minor 정책이 사용됩니다.
LatestPatch 가장 높은 패치 버전으로 롤포워드합니다. 이 값은 부 버전 롤포워드를 사용하지 않도록 설정합니다.
LatestMinor 요청된 부 버전이 있는 경우에도 가장 높은 부 버전으로 롤포워드합니다.
LatestMajor 요청된 주 버전이 있는 경우에도 가장 높은 주 버전과 가장 높은 부 버전으로 롤포워드합니다.
Disable 롤포워드하지 않고 지정된 버전에만 바인딩합니다. 이 정책은 최신 패치로 롤포워드할 수 있는 기능을 사용하지 않도록 설정하므로 일반 용도에는 권장되지 않습니다. 이 값은 테스트용으로만 사용하는 것이 좋습니다.

자체 포함 배포에 선택한 런타임 포함

애플리케이션을 자체 포함 배포로 게시할 수 있습니다. 이 방법은 .NET 런타임 및 라이브러리를 애플리케이션과 함께 번들로 제공합니다. 자체 포함 배포에는 런타임 환경에 대한 종속성이 없습니다. 런타임 버전 선택은 런타임이 아니라 게시 시간에 수행됩니다.

게시할 때 발생하는 restore 이벤트는 지정된 런타임 패밀리의 최신 패치 버전을 선택합니다. 예를 들어 .NET 5.0.3이 .NET 5.0 런타임 패밀리의 최신 패치 버전인 경우 dotnet publish는 이 버전을 선택합니다. 대상 프레임워크(설치된 최신 보안 패치 포함)는 애플리케이션과 함께 패키지됩니다.

애플리케이션에 지정된 최소 버전이 충족되지 않으면 오류가 발생합니다. dotnet publish는 최신 런타임 패치 버전(지정된 major.minor 버전 제품군 내에서)에 바인딩합니다. dotnet publishdotnet run의 롤포워드 의미 체계를 지원하지 않습니다. 패치 및 자체 포함 배포에 대한 자세한 내용은 .NET 애플리케이션 배포의 런타임 패치 선택에 대한 문서를 참조하세요.

자체 포함 배포에는 특정 패치 버전이 필요할 수 있습니다. 다음 예제와 같이 프로젝트 파일에서 최소 런타임 패치 버전(더 높거나 낮은 버전)을 재정의할 수 있습니다.

<PropertyGroup>
  <RuntimeFrameworkVersion>5.0.7</RuntimeFrameworkVersion>
</PropertyGroup>

RuntimeFrameworkVersion 요소는 기본 버전 정책보다 우선합니다. 자체 포함 배포의 경우 RuntimeFrameworkVersion정확한 런타임 프레임워크 버전을 지정합니다. 프레임워크 종속 애플리케이션의 경우 RuntimeFrameworkVersion은 필요한 최소 런타임 프레임워크 버전을 지정합니다.

참조