.NET Standard

.NET Standard는 여러 .NET 구현에서 사용할 수 있는 .NET API의 공식 규격입니다. .NET Standard는 .NET 에코시스템의 통일성을 높이기 위한 것이었습니다. .NET 5 이상 버전은 균일성을 설정하는 데 다른 접근 방식을 채택하고 있어 대부분의 시나리오에서 .NET Standard가 필요하지 않습니다. 그러나 .NET Framework와 .NET Core와 같은 기타 .NET 구현 간에 코드를 공유하려면 라이브러리에서 .NET Standard 2.0을 대상으로 해야 합니다. .NET Standard의 새 버전은 릴리스되지 않지만 .NET 5 및 모든 이후 버전은 .NET Standard 2.1 이하를 계속 지원합니다.

.NET 5+와 .NET Standard 중에서 선택하는 방법에 대한 자세한 내용은 이 문서 뒷부분의 .NET 5+ 및 .NET Standard를 참조하세요.

.NET Standard 버전

.NET Standard의 버전이 지정됩니다. 새로운 버전마다 더 많은 API가 추가됩니다. 라이브러리가 특정 버전의 .NET Standard에 대해 빌드되면 해당 버전의 .NET Standard(또는 그 이상)를 구현하는 모든 .NET 구현에서 실행될 수 있습니다.

더 높은 버전의 .NET Standard를 대상으로 하면 라이브러리에서 더 많은 API를 사용할 수 있지만 최신 버전의 .NET에서만 사용할 수 있음을 의미합니다. 낮은 버전을 대상으로 하면 사용 가능한 API가 줄어들지만 라이브러리가 더 많은 곳에서 실행될 수 있음을 의미합니다.

.NET Standard 버전 선택

.NET Standard 1.0에는 사용 가능한 API 37,118개 중 7,949개가 있습니다.

.NET 구현 버전 지원
.NET 및 .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6, 5.4, 6.4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin.Mac 3.0, 3.8, 5.16
Xamarin.Android 7.0, 8.0, 10.0
유니버설 Windows 플랫폼 8.0, 8.1, 10.0, 10.0.16299, TBD
Unity 2018.1

자세한 내용은 .NET Standard 1.0을 참조하세요. 대화형 테이블은 .NET Standard 버전을 참조하세요.

대상으로 지정할 .NET 표준 버전

이전 버전을 지원해야 하는 경우를 제외하면 .NET Standard 2.0을 대상으로 지정하는 것이 좋습니다. 대부분의 범용 라이브러리는 .NET Standard 2.0 외부의 API가 필요하지 않습니다. .NET Standard 2.0은 모든 최신 플랫폼에서 지원되며, 하나의 대상으로 여러 플랫폼을 지원하는 권장 방법입니다.

.NET Standard 1.x를 지원해야 하는 경우 .NET Standard 2.0 또한 대상으로 지정하는 것이 좋습니다. .NET Standard 1.x는 세분화된 NuGet 패키지 집합으로 배포되어 큰 패키지 종속성 그래프를 만들기 때문에 개발자가 빌드 시 많은 패키지를 다운로드해야 합니다. 자세한 내용은 이 문서 뒷부분의 플랫폼 간 대상 지정.NET 5+ 및 .NET Standard를 참조하세요.

.NET 표준 버전 관리 규칙

두 가지 기본 버전 관리 규칙이 있습니다.

  • 추가: .NET 표준 버전은 논리적으로 동심원입니다. 더 높은 버전이 이전 버전의 모든 API를 통합합니다. 버전 간에 큰 차이는 없습니다.
  • 변경 불가능: 제공되고 나면 .NET Standard 버전은 고정됩니다.

2.1 후에는 새로운 .NET Standard 버전이 없습니다. 자세한 내용은 이 문서 뒷부분의 .NET 5+ 및 .NET Standard를 참조하세요.

규격

.NET Standard 규격은 표준화된 API의 집합입니다. 이 규격은 .NET 구현자, 특히 Microsoft(.NET Framework, .NET Core, Mono 포함)와 Unity에서 유지 관리합니다.

공식 아티팩트

공식 규격은 표준의 일부인 API를 정의하는 .cs 파일 세트입니다. (현재 보관된) dotnet/standard repositoryref directory는 .NET Standard API를 정의합니다.

NETStandard.Library 메타패키지(소스)는 하나 이상의 .NET Standard 버전을 부분적으로 정의하는 라이브러리 집합에 대해 설명합니다.

System.Runtime 등의 지정된 구성 요소는 다음에 대해 설명합니다.

  • .NET 표준의 일부(해당 범위만)
  • 해당 범위에 대한 .NET 표준의 여러 버전

보다 편리하게 읽을 수 있고 특정 개발자 시나리오(예: 컴파일러 사용)를 지원할 수 있도록 파생 아티팩트가 제공됩니다.

패키지 표현

.NET Standard 참조 어셈블리의 기본 배포 수단은 NuGet 패키지입니다. 구현은 각 .NET 구현에 적절한 여러 가지 방법으로 전달됩니다.

NuGet 패키지는 하나 이상의 프레임워크를 대상으로 합니다. .NET Standard 패키지는 “.NET Standard” 프레임워크를 대상으로 합니다. netstandard압축 TFM(예: netstandard1.4)을 사용하여 .NET Standard 프레임워크를 대상으로 지정할 수 있습니다. .NET의 여러 구현에서 실행되도록 만들어진 라이브러리는 이 프레임워크를 대상으로 해야 합니다. 광범위한 API의 경우 사용 가능한 API 수가 .NET Standard 1.6과 2.0 간에 세 배 이상 증가하므로 netstandard2.0을 대상으로 지정합니다.

NETStandard.Library 메타패키지는 .NET Standard를 정의하는 NuGet 패키지의 전체 집합을 참조합니다. netstandard를 대상으로 지정하는 가장 일반적인 방법은 이 메타패키지를 참조하는 것입니다. 이 메타패키지는 최대 40개의 .NET 라이브러리 및 .NET 표준을 정의하는 관련 API를 설명하고 액세스할 수 있도록 합니다. 추가 API에 대한 액세스를 얻기 위해 netstandard를 대상으로 하는 추가 패키지를 참조할 수 있습니다.

버전 관리

사양은 단수형이 아니라 선형적으로 버전이 지정되는 API 집합입니다. 첫 번째 버전의 표준에서는 API의 기준 집합을 설정합니다. 이후 버전에서는 API를 추가하고 이전 버전에서 정의한 API를 상속받습니다. 표준에서 API 제거와 관련하여 정해진 규정은 없습니다.

.NET Standard는 어느 하나의 .NET 구현에 특정되지 않고, 이러한 구현 중 하나의 버전 관리 체계와 일치하지도 않습니다.

앞에서 설명한 것처럼 2.1 이후에는 새로운 .NET Standard 버전이 없습니다.

.NET Standard 대상 지정

netstandard 프레임워크와 NETStandard.Library 메타패키지의 조합을 사용하여 .NET Standard 라이브러리를 빌드할 수 있습니다.

.NET Framework 호환 모드

.NET Standard 2.0부터 .NET Framework 호환성 모드가 도입되었습니다. 이 호환 모드를 사용하면 .NET Standard 프로젝트가 .NET Standard에 컴파일된 것처럼 .NET Framework 라이브러리를 참조할 수 있습니다. .NET Framework 라이브러리를 참조하는 작업은 라이브러리가 WPF(Windows Presentation Foundation) API를 사용하는 것처럼 일부 프로젝트에서 작동하지 않습니다.

자세한 내용은 .NET Framework 호환 모드를 참조하세요.

.NET Standard 라이브러리 및 Visual Studio

Visual Studio에서 .NET Standard 라이브러리를 빌드하기 위해 Windows에 Visual Studio 2022, Visual Studio 2019 또는 Visual Studio 2017 버전 15.3 이상이 설치되어 있거나 macOS에 Mac용 Visual Studio 버전 7.1 이상이 설치되어 있는지 확인합니다.

프로젝트에서 .NET Standard 2.0 라이브러리를 사용해야 하는 경우 Visual Studio 2015에서 수행할 수도 있습니다. 그러나 NuGet 클라이언트 3.6 이상을 설치해야 합니다. NuGet 다운로드 페이지에서 Visual Studio 2015에 대한 NuGet 클라이언트를 다운로드할 수 있습니다.

.NET 5+ 및 .NET Standard

.NET 5, .NET 6, .NET 7 및 .NET 8은 Windows 데스크톱 앱과 플랫폼 간 콘솔 앱, 클라우드 서비스 및 웹 사이트에 사용할 수 있는 일관된 기능 및 API 집합을 갖춘 단일 제품입니다. 예를 들어, .NET 8 TFM은 다음과 같은 광범위한 시나리오를 반영합니다.

  • net8.0

    이 TFM은 어디서나 실행되는 코드에 대한 것입니다. 몇 가지 예외를 제외하고 플랫폼 간에 작동하는 기술만 포함됩니다. .NET 8 코드의 경우 net8.0netcoreappnetstandard TFM을 모두 대체합니다.

  • net8.0-windows

    이는 net8.0이 참조하는 모든 것에 OS별 기능을 추가하는 OS별 TFM의 예입니다.

net8.0과 netstandard를 대상으로 하는 경우 비교

netstandard를 대상으로 하는 기존 코드의 경우 TFM을 net8.0 또는 이후 TFM으로 변경할 필요가 없습니다. .NET 8은 .NET Standard 2.1 이전 버전을 구현합니다. .NET Standard에서 .NET 8 이상으로 대상을 변경하는 유일한 이유는 더 많은 런타임 기능, 언어 기능 또는 API에 대한 액세스 권한을 얻기 위한 것입니다. 예를 들어 C# 9를 사용하려면 .NET 5 이상 버전을 대상으로 해야 합니다. .NET 8 및 .NET Standard를 다중 대상으로 지정하여 새로운 기능에 액세스할 수 있고 다른 .NET 구현에서 라이브러리를 계속 사용할 수 있습니다.

다음은 .NET 5+용 새 코드에 대한 몇 가지 지침입니다.

  • 앱 구성 요소

    라이브러리를 사용하여 애플리케이션을 여러 구성 요소로 세분화하는 경우 net8.0을 대상으로 지정하는 것이 좋습니다. 단순성을 위해 애플리케이션을 구성하는 모든 프로젝트를 동일한 .NET 버전에서 유지하는 것이 가장 좋습니다. 그러면 어디에서나 동일한 BCL 기능을 사용할 수 있습니다.

  • 재사용 가능한 라이브러리

    NuGet에 제공하려는 재사용 가능한 라이브러리를 구축하는 경우 도달 범위와 사용 가능한 기능 집합 간의 절충을 고려하세요. .NET Standard 2.0은 .NET Framework에서 지원하는 최신 버전이므로 상당히 큰 기능 집합을 제공합니다. 도달 범위를 최소화하기 위해 사용 가능한 기능 집합을 제한하므로 .NET Standard 1.x를 대상으로 지정하지 않는 것이 좋습니다.

    .NET Framework를 지원할 필요가 없는 경우 .NET Standard 2.1 또는 .NET 8을 사용할 수 있습니다. .NET Standard 2.1을 건너뛰고 바로 .NET 8로 이동하는 것이 좋습니다. 가장 널리 사용되는 라이브러리는 .NET Standard 2.0 및 .NET 5+ 모두에 대해 다중 대상 지정이 됩니다. .NET Standard 2.0을 지원하면 최대한의 도달 범위를 얻는 반면, .NET 5+를 지원하면 이미 .NET 5+를 사용하는 고객을 위해 최신 플랫폼 기능을 활용할 수 있습니다.

.NET Standard 문제

다음은 .NET 5 이상 버전이 왜 플랫폼과 워크로드에서 코드를 공유하는 더 좋은 방법인지를 설명하는 데 도움이 되는 .NET Standard의 몇 가지 문제입니다.

  • 새 API 추가의 속도 저하

    .NET Standard는 모든 .NET 구현이 지원해야 하는 API 집합으로 만들어졌기 때문에 새 API 추가를 제안하기 위한 검토 프로세스가 있습니다. 이는 현재 및 미래의 모든 .NET 플랫폼에서 구현할 수 있는 API만 표준화하기 위한 것이었습니다. 그로 인해 기능이 특정 릴리스를 놓친 경우 표준 버전에 추가되기까지 몇 년을 기다려야 할 수도 있습니다. 그런 다음, .NET Standard의 새 버전이 널리 지원되기까지 더 오랜 시간이 걸릴 수 있습니다.

    .NET 5+의 솔루션: 기능이 구현되면 코드 기반이 공유되기 때문에 모든 .NET 5+ 앱 및 라이브러리에서 이미 사용할 수 있습니다. 그리고 API 사양과 구현 간에 차이가 없기 때문에 .NET Standard보다 훨씬 빠르게 새로운 기능을 활용할 수 있습니다.

  • 복잡한 버전 관리

    API 규격을 구현과 분리하면 API 규격 버전과 구현 버전 간의 매핑이 복잡해집니다. 이러한 복잡성은 이 문서의 앞부분에 나와 있는 표와 해석 방법에 대한 지침에서 분명히 확인할 수 있습니다.

    .NET 5+의 솔루션: .NET 5+ API 사양과 그 구현 사이에는 분리가 없습니다. 그 결과로 나온 것이 단순화된 TFM 체계입니다. 모든 워크로드에 대해 하나의 TFM 접두사가 있습니다. net8.0은 라이브러리, 콘솔 앱 및 웹앱에 사용됩니다. 유일한 변형은 net8.0-windows와 같은 특정 플랫폼에 대한 플랫폼별 API를 지정하는 접미사입니다. 이 TFM 명명 규칙 덕분에 주어진 앱이 주어진 라이브러리를 사용할 수 있는지 쉽게 알 수 있습니다. .NET Standard의 버전 번호와 같은 버전 번호 표가 필요하지 않습니다.

  • 런타임 시 플랫폼에서 지원되지 않는 예외

    .NET Standard는 플랫폼별 API를 노출합니다. 코드는 오류 없이 컴파일될 수 있으며 이식 가능하지 않더라도 모든 플랫폼에 이식 가능한 것처럼 보일 수 있습니다. 지정된 API에 대한 구현이 없는 플랫폼에서 실행되면 런타임 오류가 발생합니다.

    .NET 5+의 솔루션: .NET 5+ SDK에는 기본적으로 활성화되는 코드 분석기가 포함되어 있습니다. 플랫폼 호환성 분석기는 실행하려는 플랫폼에서 지원되지 않는 API의 의도하지 않은 사용을 감지합니다. 자세한 내용은 플랫폼 호환성 분석기를 참조하세요.

.NET Standard 사용되지 않음

.NET Standard는 여러 .NET 구현에서 사용할 수 있는 라이브러리에 계속 필요합니다. 다음 시나리오에서는 .NET Standard를 대상으로 하는 것이 좋습니다.

  • netstandard2.0을 사용하여 .NET Framework와 기타 .NET의 모든 구현 간에 코드를 공유합니다.
  • netstandard2.1를 사용하여 Mono, Xamarin 및 .NET Core 3.x 간에 코드를 공유합니다.

참고 항목