사용할 .NET Core 버전 선택Select the .NET Core version to use

이 문서에서는 버전을 선택하기 위해 .NET Core 도구, SDK 및 런타임에서 사용되는 정책에 대해 설명합니다.This article explains the policies used by the .NET Core tools, SDK, and runtime for selecting versions. 이러한 정책은 지정된 버전을 사용하여 애플리케이션을 실행하고 개발자와 최종 사용자 모두의 머신을 쉽게 업그레이드할 수 있도록 하는 균형을 제공합니다.These policies provide a balance between running applications using the specified versions and enabling ease of upgrading both developer and end-user machines. 이러한 정책은 다음 작업을 수행합니다.These policies perform the following actions:

  • 보안 및 안정성 업데이트를 포함하여 .NET Core를 쉽고 효율적으로 배포합니다.Easy and efficient deployment of .NET Core, including security and reliability updates.
  • 대상 런타임과 독립적으로 최신 도구 및 명령을 사용합니다.Use the latest tools and commands independent of target runtime.

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

이 문서의 나머지 부분에서는 이 네 가지 시나리오를 검토합니다.The rest of this document examines those four scenarios.

SDK에서 설치된 최신 버전 사용The SDK uses the latest installed version

SDK 명령에는 dotnet newdotnet run이 포함됩니다.SDK commands include dotnet new and dotnet run. .NET Core CLI는 모든 dotnet 명령의 SDK 버전을 선택해야 합니다.The .NET Core CLI must choose an SDK version for every dotnet command. 다음의 경우에도 기본적으로 머신에 설치된 최신 SDK를 사용합니다.It uses the latest SDK installed on the machine by default, even if:

  • 프로젝트가 이전 버전의 .NET Core 런타임을 대상으로 하는 경우The project targets an earlier version of the .NET Core runtime.
  • 최신 버전의 .NET Core SDK가 미리 보기 버전인 경우The latest version of the .NET Core SDK is a preview version.

이전의 .NET Core 런타임 버전을 대상으로 하면서 최신 SDK 기능과 향상된 기능을 활용할 수 있습니다.You can take advantage of the latest SDK features and improvements while targeting earlier .NET Core runtime versions. 모든 프로젝트에 대해 동일한 SDK 도구를 사용하여 여러 프로젝트에서 .NET Core의 여러 런타임 버전을 대상으로 지정할 수 있습니다.You can target multiple runtime versions of .NET Core on different projects, using the same SDK tools for all projects.

드물지만 경우에 따라 이전 버전의 SDK를 사용해야 할 수도 있습니다.On rare occasions, you may need to use an earlier version of the SDK. 해당 버전은 global.json 파일에 지정합니다.You specify that version in a global.json file. "최신 버전 사용" 정책은 global.json을 사용하여 설치된 최신 버전보다 이전의 .NET Core SDK 버전을 지정한다는 것을 의미합니다.The "use latest" policy means you only use global.json to specify a .NET Core SDK version earlier than the latest installed version.

global.json은 파일 계층 구조에서 원하는 위치에 배치할 수 있습니다.global.json can be placed anywhere in the file hierarchy. CLI는 검색된 첫 번째 global.json의 프로젝트 디렉터리에서 위쪽 방향으로 검색합니다.The CLI searches upward from the project directory for the first global.json it finds. 파일 시스템의 해당 위치에 따라 지정된 global.json이 적용되는 프로젝트를 제어합니다.You control which projects a given global.json applies to by its place in the file system. .NET CLI는 현재 작업 디렉터리에서 위쪽 경로로 반복적으로 탐색하면서 global.json 파일을 검색합니다.The .NET CLI searches for a global.json file iteratively navigating the path upward from the current working directory. 검색된 첫 번째 global.json 파일에서 사용된 버전을 지정합니다.The first global.json file found specifies the version used. 해당 버전이 설치되어 있으면 이 버전이 사용됩니다.If that version is installed, that version is used. global.json에 지정된 SDK가 없으면 .NET CLI에서 설치된 최신 SDK로 롤포워드합니다.If the SDK specified in the global.json is not found, the .NET CLI rolls forward to the latest SDK installed. 롤포워드는 global.json 파일이 없는 경우 기본 동작과 동일합니다.Roll-forward is the same as the default behavior, when no global.json file is found.

다음 예제에서는 global.json 구문을 보여 줍니다.The following example shows the global.json syntax:

{
  "sdk": {
    "version": "2.0.0"
  }
}

SDK 버전을 선택하는 프로세스는 다음과 같습니다.The process for selecting an SDK version is:

  1. dotnet은 현재 작업 디렉터리에서 위쪽 경로로의 역방향으로 반복하여 탐색하면서 global.json 파일을 검색합니다.dotnet searches for a global.json file iteratively reverse-navigating the path upward from the current working directory.
  2. dotnet은 검색된 첫 번째 global.json에 지정된 SDK를 사용합니다.dotnet uses the SDK specified in the first global.json found.
  3. global.json이 없으면 dotnet에서 설치된 최신 SDK를 사용합니다.dotnet uses the latest installed SDK if no global.json is found.

global.json에 있는 문서의 일치 규칙 섹션에서 SDK 버전 선택에 대해 자세히 알아볼 수 있습니다.You can learn more about selecting an SDK version in the Matching rules section of the article on global.json.

대상 프레임워크 모니커에서 빌드 시간 API 정의Target Framework Monikers define build time APIs

TFM(대상 프레임워크 모니커)에 정의된 API에 대해 프로젝트를 빌드합니다.You build your project against APIs defined in a Target Framework Moniker (TFM). 프로젝트 파일에서 대상 프레임워크를 지정합니다.You specify the target framework in the project file. 다음 예제와 같이 프로젝트 파일에서 TargetFramework 요소를 설정합니다.Set the TargetFramework element in your project file as shown in the following example:

<TargetFramework>netcoreapp2.0</TargetFramework>

여러 개의 TFM에 대해 프로젝트를 구축할 수 있습니다.You may build your project against multiple TFMs. 여러 대상 프레임워크를 설정하는 것은 라이브러리에서 더 일반적이지만, 애플리케이션에서도 수행할 수 있습니다.Setting multiple target frameworks is more common for libraries but can be done with applications as well. TargetFrameworks 속성(TargetFramework의 복수형)을 지정합니다.You specify a TargetFrameworks property (plural of TargetFramework). 대상 프레임워크는 다음 예제와 같이 세미콜론으로 구분됩니다.The target frameworks are semicolon-delimited as shown in the following example:

<TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>

지정된 SDK는 함께 제공되는 런타임의 대상 프레임워크로 제한된 프레임워크의 고정된 집합을 지원합니다.A given SDK supports a fixed set of frameworks, capped to the target framework of the runtime it ships with. 예를 들어 .NET Core 2.0 SDK에는 netcoreapp2.0 대상 프레임워크의 구현인 .NET Core 2.0 런타임이 포함되어 있습니다.For example, the .NET Core 2.0 SDK includes the .NET Core 2.0 runtime, which is an implementation of the netcoreapp2.0 target framework. .NET Core 2.0 SDK는 netcoreapp1.0, netcoreapp1.1netcoreapp2.0을 지원하지만, netcoreapp2.1(또는 그 이상)은 지원하지 않습니다.The .NET Core 2.0 SDK supports netcoreapp1.0, netcoreapp1.1, and netcoreapp2.0 but not netcoreapp2.1 (or higher). .NET Core 2.1 SDK를 설치하여 netcoreapp2.1을 빌드합니다.You install the .NET Core 2.1 SDK to build for netcoreapp2.1.

또한 .NET Standard 대상 프레임워크도 SDK에서 제공하는 런타임의 대상 프레임워크로 제한됩니다..NET Standard target frameworks are also capped to the target framework of the runtime the SDK ships with. .NET Core 2.0 SDK는 netstandard2.0으로 제한됩니다.The .NET Core 2.0 SDK is capped to netstandard2.0.

프레임워크 종속 응용 프로그램 롤포워드Framework-dependent apps roll forward

dotnet run를 사용하여 소스에서, dotnet myapp.dll을 사용하여 프레임워크 종속 배포에서 또는 myapp.exe를 사용하여 프레임워크 종속 실행 파일에서 애플리케이션을 실행하는 경우 dotnet 실행 파일이 애플리케이션의 호스트입니다.When you run an application from source with dotnet run, from a framework-dependent deployment with dotnet myapp.dll, or from a framework-dependent executable with myapp.exe, the dotnet executable is the host for the application.

호스트는 머신에 설치된 최신 패치 버전을 선택합니다.The host chooses the latest patch version installed on the machine. 예를 들어 프로젝트 파일에서 netcoreapp2.0을 지정하고 2.0.4가 설치된 최신 .NET 런타임인 경우 2.0.4 런타임이 사용됩니다.For example, if you specified netcoreapp2.0 in your project file, and 2.0.4 is the latest .NET runtime installed, the 2.0.4 runtime is used.

허용되는 2.0.* 버전이 없으면 새 2.* 버전이 사용됩니다.If no acceptable 2.0.* version is found, a new 2.* version is used. 예를 들어 netcoreapp2.0을 지정하고 2.1.0만 설치된 경우 2.1.0 런타임을 사용하여 애플리케이션이 실행됩니다.For example, if you specified netcoreapp2.0 and only 2.1.0 is installed, the application runs using the 2.1.0 runtime. 이 동작을 "부 버전 롤포워드"라고 합니다.This behavior is referred to as "minor version roll-forward." 또한 더 낮은 버전은 고려되지 않습니다.Lower versions also won't be considered. 허용 가능한 런타임이 설치되어 있지 않으면 애플리케이션이 실행되지 않습니다.When no acceptable runtime is installed, the application won't run.

2.0을 대상으로 하는 경우 몇 가지 사용 예에서 동작을 시연합니다.A few usage examples demonstrate the behavior, if you target 2.0:

  • 2.0이 지정됩니다.2.0 is specified. 2.0.5는 설치된 가장 높은 패치 버전입니다.2.0.5 is the highest patch version installed. 2.0.5가 사용됩니다.2.0.5 is used.
  • 2.0이 지정됩니다.2.0 is specified. 2.0.* 버전이 설치되어 있지 않습니다.No 2.0.* versions are installed. 1.1.1은 설치된 가장 높은 런타임 버전입니다.1.1.1 is the highest runtime installed. 오류 메시지가 표시됩니다.An error message is displayed.
  • 2.0이 지정됩니다.2.0 is specified. 2.0.* 버전이 설치되어 있지 않습니다.No 2.0.* versions are installed. 2.2.2는 설치된 가장 높은 2.x 런타임 버전입니다.2.2.2 is the highest 2.x runtime version installed. 2.2.2가 사용됩니다.2.2.2 is used.
  • 2.0이 지정됩니다.2.0 is specified. 2.x 버전이 설치되어 있지 않습니다.No 2.x versions are installed. 3.0.0이 설치됩니다.3.0.0 is installed. 오류 메시지가 표시됩니다.An error message is displayed.

부 버전 롤포워드에는 최종 사용자에게 영향을 줄 수 있는 하나의 부작용이 있습니다.Minor version roll-forward has one side-effect that may affect end users. 다음 시나리오를 고려하세요.Consider the following scenario:

  1. 애플리케이션은 2.0이 필수가 되도록 지정합니다.The application specifies that 2.0 is required.
  2. 실행 시 버전 2.0.*은 설치되지 않지만 2.2.2는 설치됩니다.When run, version 2.0.* is not installed, however, 2.2.2 is. 버전 2.2.2가 사용됩니다.Version 2.2.2 will be used.
  3. 나중에 사용자가 2.0.5를 설치하고 애플리케이션을 다시 실행하면 이제 2.0.5가 사용됩니다.Later, the user installs 2.0.5 and runs the application again, 2.0.5 will now be used.

2.0.5와 2.2.2는 다르게 동작할 수도 있습니다. 특히 이진 데이터를 직렬화하는 것과 같은 시나리오에서는 다르게 동작합니다.It's possible that 2.0.5 and 2.2.2 behave differently, particularly for scenarios like serializing binary data.

자체 포함 배포에 선택한 런타임 포함Self-contained deployments include the selected runtime

애플리케이션을 자체 포함 배포로 게시할 수 있습니다.You can publish an application as a self-contained distribution. 이 방법은 .NET Core 런타임 및 라이브러리를 애플리케이션과 함께 번들로 제공합니다.This approach bundles the .NET Core runtime and libraries with your application. 자체 포함 배포에는 런타임 환경에 대한 종속성이 없습니다.Self-contained deployments don't have a dependency on runtime environments. 런타임 버전 선택은 런타임이 아니라 게시 시간에 수행됩니다.Runtime version selection occurs at publishing time, not run time.

게시 프로세스는 지정된 런타임 제품군의 최신 패치 버전을 선택합니다.The publishing process selects the latest patch version of the given runtime family. 예를 들어 .NET Core 2.0.4가 .NET Core 2.0 런타임 제품군의 최신 패치 버전인 경우 dotnet publish는 .NET Core 2.0.4를 선택합니다.For example, dotnet publish will select .NET Core 2.0.4 if it is the latest patch version in the .NET Core 2.0 runtime family. 대상 프레임워크(설치된 최신 보안 패치 포함)는 애플리케이션과 함께 패키지됩니다.The target framework (including the latest installed security patches) is packaged with the application.

애플리케이션에 대해 지정된 최소 버전이 충족되지 않으면 오류가 발생합니다.It's an error if the minimum version specified for an application isn't satisfied. dotnet publish는 최신 런타임 패치 버전(지정된 major.minor 버전 제품군 내에서)에 바인딩합니다.dotnet publish binds to the latest runtime patch version (within a given major.minor version family). dotnet publishdotnet run의 롤포워드 의미 체계를 지원하지 않습니다.dotnet publish doesn't support the roll-forward semantics of dotnet run. 패치 및 자체 포함 배포에 대한 자세한 내용은 .NET Core 애플리케이션 배포의 런타임 패치 선택에 대한 문서를 참조하세요.For more information about patches and self-contained deployments, see the article on runtime patch selection in deploying .NET Core applications.

자체 포함 배포에는 특정 패치 버전이 필요할 수 있습니다.Self-contained deployments may require a specific patch version. 다음 예제와 같이 프로젝트 파일에서 최소 런타임 패치 버전(더 높거나 낮은 버전)을 재정의할 수 있습니다.You can override the minimum runtime patch version (to higher or lower versions) in the project file, as shown in the following example:

<RuntimeFrameworkVersion>2.0.4</RuntimeFrameworkVersion>

RuntimeFrameworkVersion 요소는 기본 버전 정책보다 우선합니다.The RuntimeFrameworkVersion element overrides the default version policy. 자체 포함 배포의 경우 RuntimeFrameworkVersion정확한 런타임 프레임워크 버전을 지정합니다.For self-contained deployments, the RuntimeFrameworkVersion specifies the exact runtime framework version. 프레임워크 종속 애플리케이션의 경우 RuntimeFrameworkVersion은 필요한 최소 런타임 프레임워크 버전을 지정합니다.For framework-dependent applications, the RuntimeFrameworkVersion specifies the minimum required runtime framework version.