SDK 스타일 프로젝트의 대상 프레임워크

앱 또는 라이브러리에서 프레임워크를 대상으로 지정하면 앱 또는 라이브러리에서 사용할 수 있도록 하려는 API 집합을 지정하는 것입니다. TFM(대상 프레임워크 모니커)을 사용하여 프로젝트 파일에서 대상 프레임워크를 지정합니다.

앱 또는 라이브러리는 .NET Standard 버전을 대상으로 지정할 수 있습니다. .NET Standard 버전은 모든 .NET 구현체에서 사용할 수 있는 표준화된 API 집합을 나타냅니다. 예를 들어 .NET Standard 1.6을 대상으로 하는 라이브러리는 동일한 코드 기반의 .NET Core 및 .NET Framework에서 동작하는 API에 액세스할 수 있습니다.

앱 또는 라이브러리는 특정 .NET 구현체을 대상으로 지정하여 구현체 관련 API에 액세스할 수도 있습니다. 예를 들어 Xamarin.iOS(예: Xamarin.iOS10)를 대상으로 하는 앱은 Xamarin에서 제공하는 iOS 10용 iOS API 래퍼에 액세스하고, UWP(유니버설 Windows 플랫폼, uap10.0)를 대상으로 하는 앱은 Windows 10이 실행되는 디바이스용으로 컴파일하는 API에 액세스할 수 있습니다.

일부 대상 프레임워크(예: .NET Framework)에서 API는 프레임워크에서 시스템에 설치하는 어셈블리에 의해 정의되고 애플리케이션 프레임워크 API(예: ASP.NET)를 포함할 수 있습니다.

패키지 기반 대상 프레임워크(예: .NET 5 이상, .NET Core, .NET Standard)에서 API는 앱이나 라이브러리에 포함된 NuGet 패키지에 의해 정의됩니다.

최신 버전

다음 표에서는 가장 일반적인 대상 프레임워크, 프레임워크가 참조되는 방법 및 프레임워크에서 구현하는 .NET Standard의 버전을 정의합니다. 이러한 대상 프레임워크 버전은 안정적인 최신 버전입니다. 시험판 버전은 표시되지 않았습니다. TFM(대상 프레임워크 모니커)은 .NET 앱 또는 라이브러리의 대상 프레임워크를 지정하기 위해 표준화된 토큰 형식입니다.

대상 프레임워크 가장 늦은 날짜
안정적인 버전
TFM(대상 프레임워크 모니커) 구현된
.NET Standard 버전
.NET 8 8 net8.0 2.1
.NET 7 7 net7.0 2.1
.NET 6 6 net6.0 2.1
.NET 5 5 net5.0 2.1
.NET Standard 2.1 netstandard2.1 해당 없음
.NET Core 3.1 netcoreapp3.1 2.1
.NET Framework 4.8.1 net481 2.0

지원되는 대상 프레임워크

대상 프레임워크는 일반적으로 TFM에서 참조됩니다. 다음 표에서는 .NET SDK 및 NuGet 클라이언트에서 지원되는 대상 프레임워크를 보여 줍니다. 동일한 항목은 대괄호 내에 표시됩니다. 예를 들어 win81netcore451과 동일한 TFM입니다.

대상 프레임워크 TFM
.NET 5 이상(및 .NET Core) netcoreapp1.0
netcoreapp1.1
netcoreapp2.0
netcoreapp2.1
netcoreapp2.2
netcoreapp3.0
netcoreapp3.1
net5.0*
net6.0*
net7.0*
net8.0*
.NET Standard netstandard1.0
netstandard1.1
netstandard1.2
netstandard1.3
netstandard1.4
netstandard1.5
netstandard1.6
netstandard2.0
netstandard2.1
.NET Framework net11
net20
net35
net40
net403
net45
net451
net452
net46
net461
net462
net47
net471
net472
net48
net481
Windows 스토어 netcore [netcore45]
netcore45 [win] [win8]
netcore451 [win81]
.NET Micro Framework netmf
Silverlight sl4
sl5
Windows Phone wp [wp7]
wp7
wp75
wp8
wp81
wpa81
유니버설 Windows 플랫폼 uap [uap10.0]
uap10.0 [win10] [netcore50]

* .NET 5 이상 TFM에는 일부 운영 체제별 변형이 포함됩니다. 자세한 내용은 .NET 5+ OS별 TFM 섹션을 참조하세요.

.NET 5+ OS별 TFM

net5.0, net6.0, net7.0net8.0 TFM에는 다양한 플랫폼에서 작동하는 기술이 포함되어 있습니다. OS별 TFM을 지정하면 운영 체제와 관련된 API를 앱에서 사용할 수 있도록 합니다(예: Windows Forms 또는 iOS 바인딩). OS별 TFM은 해당 기본 TFM(예: net6.0 TFM)에 사용할 수 있는 모든 API도 상속합니다.

.NET 5에는 WinForms, WPF 및 UWP API에 대한 Windows 관련 바인딩을 포함하는 net5.0-windows OS별 TFM이 도입되었습니다. .NET 6 이상 버전에는 추가 OS별 TFM(예: net6.0-ios)이 있습니다.

다음 표에서는 .NET 5+ TFM의 호환성을 보여줍니다.

TFM 호환 가능
net5.0 net1..4(NU1701 경고 포함)
netcoreapp1..3.1(WinForms 또는 WPF가 참조되는 경우 경고)
netstandard1..2.1
net5.0-windows netcoreapp1..3.1(net5.0에서 상속되는 다른 모든 항목 포함)
net6.0 (net5.0의 후속 버전)
net6.0-android xamarin.android(및 net6.0에서 상속된 모든 항목)
net6.0-ios xamarin.ios(및 net6.0에서 상속된 모든 항목)
net6.0-maccatalyst xamarin.ios(및 net6.0에서 상속된 모든 항목)
net6.0-macos xamarin.mac(및 net6.0에서 상속된 모든 항목)
net6.0-tvos xamarin.tvos(및 net6.0에서 상속된 모든 항목)
net6.0-windows (net5.0-windows의 후속 버전)
net7.0 (net6.0의 후속 버전)
net7.0-android (net6.0-android의 후속 버전)
net7.0-ios (net6.0-ios의 후속 버전)
net7.0-maccatalyst (net6.0-maccatalyst의 후속 버전)
net7.0-macos (net6.0-macos의 후속 버전)
net7.0-tizen tizen40(및 net7.0에서 상속된 모든 항목)
net7.0-tvos (net6.0-tvos의 후속 버전)
net7.0-windows (net6.0-windows의 후속 버전)
net8.0 (net7.0의 후속 버전)
net8.0-android (net7.0-android의 후속 버전)
net8.0-browser net8.0에서 상속된 모든 항목
net8.0-ios (net7.0-ios의 후속 버전)
net8.0-maccatalyst (net7.0-maccatalyst의 후속 버전)
net8.0-macos (net7.0-macos의 후속 버전)
net8.0-tizen (net7.0-tizen의 후속 버전)
net8.0-tvos (net7.0-tvos의 후속 버전)
net8.0-windows (net7.0-windows의 후속 버전)

여러 플랫폼에서 앱을 이식 가능하게 만들면서 OS별 API에 액세스할 수 있도록 하려면 여러 OS별 TFM을 대상으로 지정하고 #if 전처리기 지시문을 사용하여 OS별 API 호출을 기준으로 플랫폼 가드를 추가할 수 있습니다. 사용 가능한 기호 목록은 전처리기 기호를 참조하세요.

제안된 대상

다음 지침을 사용하여 앱에서 사용할 TFM을 결정합니다.

  • 여러 플랫폼으로 이식할 수 있는 앱은 기본 TFM(예: net8.0)을 대상으로 해야 합니다. 여기에는 대부분의 라이브러리가 포함되며 ASP.NET Core 및 Entity Framework도 포함됩니다.

  • 플랫폼별 라이브러리는 플랫폼별 버전을 대상으로 지정해야 합니다. 예를 들어 WinForms 및 WPF 프로젝트는 net8.0-windows를 대상으로 지정해야 합니다.

  • 플랫폼 간 애플리케이션 모델(Xamarin Forms, ASP.NET Core) 및 브리지 팩(Xamarin Essentials)은 최소한 기본 TFM(예: net8.0)을 대상으로 지정해야 하지만 추가 플랫폼별 버전을 대상으로 지정하여 더 많은 API 또는 기능을 강화할 수도 있습니다.

TFM의 OS 버전

OS 관련 TFM 종료 시 선택적 OS 버전을 지정할 수도 있습니다(예: net6.0-ios15.0). 버전은 앱 또는 라이브러리에서 사용할 수 있는 API를 나타냅니다. 앱이나 라이브러리가 런타임에 지원하는 OS 버전을 제어하지 않습니다. 프로젝트에서 컴파일하는 참조 어셈블리를 선택하고 NuGet 패키지에서 자산을 선택하는 데 사용됩니다. 이 버전을 “플랫폼 버전” 또는 “OS API 버전”으로 생각하여 런타임 OS 버전과 명확하게 구분합니다.

OS 관련 TFM이 플랫폼 버전을 명시적으로 지정하지 않으면 기본 TFM 및 플랫폼 이름에서 유추할 수 있는 암시적 값을 포함합니다. 예를 들어, .NET 6에서 iOS의 기본 플랫폼 값은 15.0입니다. 즉, net6.0-ios는 정식 net6.0-ios15.0 TFM의 축약형입니다. 최신 기본 TFM의 암시적 플랫폼 버전은 더 높을 수 있습니다. 예를 들어, 향후 net8.0-ios TFM은 net8.0-ios16.0에 매핑될 수 있습니다. 축약형 형식은 프로젝트 파일에서만 사용되어야 하며 NuGet 같은 다른 도구에 전달되기 전에 .NET SDK의 MSBuild 대상에 의해 정식 양식으로 확장됩니다.

다음 표에서는 각 .NET 릴리스에 대한 기본 TPV(대상 플랫폼 값)를 보여 줍니다.

.NET 버전 플랫폼 기본 TPV
.NET 6 Android 31.0
.NET 7 Android 33.0
.NET 8 Android 34.0
.NET 6 iOS 15.0
.NET 7 iOS 16.1
.NET 8 iOS 17.2
.NET 6 Mac Catalyst 15.0
.NET 7 Mac Catalyst 16.1
.NET 8 Mac Catalyst 17.2
.NET 6 macOS 12.0
.NET 7 macOS 13.0
.NET 8 macOS 14.2
.NET 6 tvOS 15.1
.NET 7 tvOS 16.1
.NET 8 tvOS 17.1
.NET 7 Tizen 7.0
.NET 8 Tizen 8.0
.NET 6 Windows 7.0
.NET 7 Windows 7.0
.NET 8 Windows 7.0

.NET SDK는 새 버전의 기본 TFM 없이 개별 플랫폼에 대해 새로 릴리스된 API를 지원할 수 있도록 디자인되었습니다. 이렇게 하면 .NET의 주 릴리스를 기다리지 않고 플랫폼 관련 기능에 액세스할 수 있습니다. TFM에서 플랫폼 버전을 증분시켜 해당하는 새로 릴리스된 API에 액세스할 수 있습니다. 예를 들어, iOS 플랫폼이 .NET 6.0.x SDK 업데이트에 iOS 15.1 API를 추가한 경우 TFM net6.0-ios15.1을 사용하여 액세스할 수 있습니다.

우선 순위

앱이 서로 다른 TFM에 대한 여러 자산이 있는 패키지를 참조하는 경우 버전 번호가 더 가까운 자산이 기본 설정됩니다. 예를 들어, 앱이 net6.0-ios를 대상으로 하고 패키지가 net6.0net5.0-ios에 대한 자산을 제공하는 경우 net6.0 자산이 사용됩니다. 자세한 내용은 우선 순위를 참조하세요.

이전 OS 버전 지원

플랫폼 관련 앱 또는 라이브러리는 해당 OS 특정 버전의 API에 대해 컴파일되지만 프로젝트 파일에 SupportedOSPlatformVersion 속성을 추가하여 이전 OS 버전과 호환되도록 만들 수 있습니다. SupportedOSPlatformVersion 속성은 앱이나 라이브러리를 실행하는 데 필요한 최소 OS 버전을 나타냅니다. 프로젝트에서 이 최소 런타임 OS 버전을 명시적으로 지정하지 않으면 기본적으로 TFM의 플랫폼 버전으로 설정됩니다.

앱이 이전 OS 버전에서 제대로 실행되면 해당 OS 버전에 없는 API를 호출할 수 없습니다. 그러나 최신 API는 지원하는 OS 버전에서 실행될 때만 호출되도록 해당 API 호출 주위에 가드를 추가할 수 있습니다. 이 패턴을 사용하면 최신 OS 버전에서 실행될 때 최신 OS 기능을 활용하는 동시에 이전 OS 버전에서 실행을 지원하도록 앱 또는 라이브러리를 디자인할 수 있습니다.

SupportedOSPlatformVersion 값(명시적 또는 기본값인지 관계없음)은 최신 API에 대한 보호되지 않는 호출을 검색하고 경고하는 플랫폼 호환성 분석기에서 사용됩니다. 프로젝트의 컴파일된 어셈블리에 UnsupportedOSPlatformAttribute 어셈블리 특성으로 구워지므로 플랫폼 호환성 분석기가 SupportedOSPlatformVersion 값이 더 낮은 프로젝트에서 해당 어셈블리의 API에 대한 보호되지 않는 호출을 검색할 수 있습니다. 일부 플랫폼에서 SupportedOSPlatformVersion 값은 플랫폼 관련 앱 패키징 및 빌드 프로세스에 영향을 주며, 해당 플랫폼에 관한 설명서에서 다룹니다.

다음은 TargetFrameworkSupportedOSPlatformVersion MSBuild 속성을 사용하여 앱 또는 라이브러리가 iOS 15.0 API에 액세스할 수 있지만 iOS 13.0 이상에서 실행을 지원하도록 지정하는 프로젝트 파일의 예제 인용입니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0-ios15.0</TargetFramework>
    <SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
  </PropertyGroup>
  ...

</Project>

대상 프레임워크를 지정하는 방법

대상 프레임워크는 프로젝트 파일에서 지정합니다. 단일 대상 프레임워크를 지정하는 경우 TargetFramework 요소를 사용합니다. 다음 콘솔 앱 프로젝트 파일에서는 .NET 8을 대상 프레임워크로 지정하는 방법을 보여 줍니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>

</Project>

여러 대상 프레임워크를 지정하는 경우 각 대상 프레임워크에 대한 어셈블리를 조건에 따라 참조할 수 있습니다. 코드에서는 if-then-else 논리에 전처리기 기호를 사용하여 해당 어셈블리를 조건에 따라 컴파일할 수 있습니다.

다음 라이브러리 프로젝트는 .NET Standard(netstandard1.4)의 API 및 .NET Framework(net40net45)의 API를 대상으로 합니다. 다중 대상 프레임워크에는 복수형 TargetFrameworks 요소를 사용합니다. 라이브러리가 두 개의 .NET Framework TFM에 대해 컴파일되면 Condition 특성에 구현 관련 패키지가 포함됩니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard1.4;net40;net45</TargetFrameworks>
  </PropertyGroup>

  <!-- Conditionally obtain references for the .NET Framework 4.0 target -->
  <ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
    <Reference Include="System.Net" />
  </ItemGroup>

  <!-- Conditionally obtain references for the .NET Framework 4.5 target -->
  <ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Threading.Tasks" />
  </ItemGroup>

</Project>

라이브러리나 앱에서 전처리기 지시문으로 조건 코드를 작성하여 각 대상 프레임워크에 대해 컴파일합니다.

public class MyClass
{
    static void Main()
    {
#if NET40
        Console.WriteLine("Target framework: .NET Framework 4.0");
#elif NET45
        Console.WriteLine("Target framework: .NET Framework 4.5");
#else
        Console.WriteLine("Target framework: .NET Standard 1.4");
#endif
    }
}

전처리기 기호

빌드 시스템은 SDK 스타일 프로젝트를 사용할 때 지원되는 대상 프레임워크 버전 표에 표시된 대상 프레임워크를 나타내는 전처리기 기호를 인식합니다. .NET Standard, .NET Core 또는 .NET 5+ TFM을 전처리기 기호로 변환하려면 점과 하이픈을 밑줄로 바꾸고 소문자를 대문자로 변경합니다. 예를 들어 netstandard1.4에 대한 기호는 NETSTANDARD1_4입니다.

DisableImplicitFrameworkDefines 속성을 통해 이러한 기호 생성을 사용하지 않도록 설정할 수 있습니다. 이 속성에 대한 자세한 내용은 DisableImplicitFrameworkDefines를 참조하세요.

다음은 .NET 대상 프레임워크에 대한 전체 전처리기 기호 목록입니다.

대상 프레임워크 기호 추가 기호
(.NET 5+ SDK에서 사용 가능)
플랫폼 기호(OS별
TFM을 지정할 때만 사용 가능)
.NET Framework NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, NET40, NET35, NET20 NET48_OR_GREATER, NET472_OR_GREATER, NET471_OR_GREATER, NET47_OR_GREATER, NET462_OR_GREATER, NET461_OR_GREATER, NET46_OR_GREATER, NET452_OR_GREATER, NET451_OR_GREATER, NET45_OR_GREATER, NET40_OR_GREATER, NET35_OR_GREATER, NET20_OR_GREATER
.NET Standard NETSTANDARD, NETSTANDARD2_1, NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1, NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATER, NETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, NETSTANDARD1_2_OR_GREATER, NETSTANDARD1_1_OR_GREATER, NETSTANDARD1_0_OR_GREATER
.NET 5 이상(및 .NET Core) NET, NET8_0, NET7_0, NET6_0, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0 NET8_0_OR_GREATER, NET7_0_OR_GREATER, NET6_0_OR_GREATER, NET5_0_OR_GREATER, NETCOREAPP3_1_OR_GREATER, NETCOREAPP3_0_OR_GREATER, NETCOREAPP2_2_OR_GREATER, NETCOREAPP2_1_OR_GREATER, NETCOREAPP2_0_OR_GREATER, NETCOREAPP1_1_OR_GREATER, NETCOREAPP1_0_OR_GREATER ANDROID, BROWSER, IOS, MACCATALYST, MACOS, TVOS, WINDOWS,
[OS][version](예를 들어 IOS15_1),
[OS][version]_OR_GREATER(예를 들어 IOS15_1_OR_GREATER)

참고 항목

  • 버전 없는 기호는 대상으로 지정하는 버전과 무관하게 정의됩니다.
  • 버전별 기호는 대상으로 지정하는 버전에 대해서만 정의됩니다.
  • <framework>_OR_GREATER 기호는 대상으로 지정하는 버전과 모든 이전 버전에 대해 정의됩니다. 예를 들어 .NET Framework 2.0을 대상으로 지정하는 경우 NET20, NET20_OR_GREATER, NET11_OR_GREATER, NET10_OR_GREATER 기호가 정의됩니다.
  • NETSTANDARD<x>_<y>_OR_GREATER 기호는 .NET Standard 대상에 대해서만 정의되며 .NET Core 및 .NET Framework와 같은 .NET Standard를 구현하는 대상에는 정의되지 않습니다.
  • 이는 MSBuild TargetFramework 속성NuGet에서 사용되는 TFM(대상 프레임워크 모니커)와는 다릅니다.

사용되지 않는 대상 프레임워크

다음 대상 프레임워크는 사용되지 않습니다. 이러한 대상 프레임워크를 대상으로 하는 패키지는 지정된 대체 항목으로 마이그레이션되어야 합니다.

사용되지 않는 TFM 치환
aspnet50
aspnetcore50
dnxcore50
dnx
dnx45
dnx451
dnx452
netcoreapp
dotnet
dotnet50
dotnet51
dotnet52
dotnet53
dotnet54
dotnet55
dotnet56
netstandard
netcore50 uap10.0
win netcore45
win8 netcore45
win81 netcore451
win10 uap10.0
winrt netcore45

참고 항목