앱 또는 라이브러리에서 프레임워크를 대상으로 지정하면 앱 또는 라이브러리에서 사용할 수 있도록 하려는 API 집합을 지정하는 것입니다. TFM(대상 프레임워크 모니커)을 사용하여 프로젝트 파일에서 대상 프레임워크를 지정합니다.
앱 또는 라이브러리는 .NET Standard 버전을 대상으로 지정할 수 있습니다. .NET Standard 버전은 모든 .NET 구현체에서 사용할 수 있는 표준화된 API 집합을 나타냅니다. 예를 들어 .NET Standard 1.6을 대상으로 하는 라이브러리는 동일한 코드 기반의 .NET Core 및 .NET Framework에서 동작하는 API에 액세스할 수 있습니다.
앱 또는 라이브러리는 특정 .NET 구현체을 대상으로 지정하여 구현체 관련 API에 액세스할 수도 있습니다. 예를 들어 UWP uap10.0
(유니버설 Windows 플랫폼)를 대상으로 하는 앱은 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 9 | 9 | net9.0 | 2.1 |
.NET 8 | 8 (여덟) | net8.0 | 2.1 |
.NET Standard | 2.1 | netstandard2.1 | 해당 없음 |
.NET 코어 | 3.1 | netcoreapp3.1 | 2.1 |
.NET Framework | 4.8.1 | net481 | 2.0 |
지원되는 대상 프레임워크
대상 프레임워크는 일반적으로 TFM에서 참조됩니다. 다음 표에서는 .NET SDK 및 NuGet 클라이언트에서 지원되는 대상 프레임워크를 보여 줍니다. 동일한 항목은 대괄호 내에 표시됩니다. 예를 들어 win81
은 netcore451
과 동일한 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* net9.0* |
.NET Standard | netstandard1.0 netstandard1.1 netstandard1.2 netstandard1.3 netstandard1.4 netstandard1.5 netstandard1.6 netstandard2.0 netstandard2.1 |
.NET Framework | net11 네트20 net35 net40 net403 net45 net451 net452 넷46 net461 net462 net47 net471 net472 net48 net481 |
Windows 스토어 | netcore [netcore45] netcore45 [win] [win8] netcore451 [win81] |
.NET nanoFramework | netnano1.0 |
.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.0
net8.0
및 net9.0
TFM에는 여러 플랫폼에서 작동하는 기술이 포함됩니다.
OS별 TFM을 지정하면 운영 체제와 관련된 API를 앱에서 사용할 수 있도록 합니다(예: Windows Forms 또는 iOS 바인딩). OS별 TFM은 해당 기본 TFM(예: net9.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 |
net6.0 에서 상속된 모든 항목 |
net6.0-maccatalyst |
net6.0 에서 상속된 모든 항목 |
net6.0-macos |
net6.0 에서 상속된 모든 항목 |
net6.0-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 의 후속 버전) |
net9.0 |
(net8.0 의 후속 버전) |
net9.0-android |
(net8.0-android 의 후속 버전) |
net9.0-browser |
(net8.0-browser 의 후속 버전) |
net9.0-ios |
(net8.0-ios 의 후속 버전) |
net9.0-maccatalyst |
(net8.0-maccatalyst 의 후속 버전) |
net9.0-macos |
(net8.0-macos 의 후속 버전) |
net9.0-tizen |
(net8.0-tizen 의 후속 버전) |
net9.0-tvos |
(net8.0-tvos 의 후속 버전) |
net9.0-windows |
(net8.0-windows 의 후속 버전) |
여러 플랫폼에서 앱을 이식 가능하게 만들면서 OS별 API에 액세스할 수 있도록 하려면 여러 OS별 TFM을 대상으로 지정하고 #if
전처리기 지시문을 사용하여 OS별 API 호출을 기준으로 플랫폼 가드를 추가할 수 있습니다. 사용 가능한 기호 목록은 전처리기 기호를 참조하세요.
제안된 대상
다음 지침을 사용하여 앱에서 사용할 TFM을 결정합니다.
- 여러 플랫폼으로 이식할 수 있는 앱은 기본 TFM(예:
net9.0
)을 대상으로 해야 합니다. 여기에는 대부분의 라이브러리가 포함되며 ASP.NET Core 및 Entity Framework도 포함됩니다. - 플랫폼별 라이브러리는 플랫폼별 버전을 대상으로 지정해야 합니다. 예를 들어 WinForms 및 WPF 프로젝트는
net9.0-windows
를 대상으로 지정해야 합니다. - 플랫폼 간 애플리케이션 모델(예: ASP.NET Core)은 적어도 기본 TFM
net9.0
을 대상으로 지정해야 하지만 추가 플랫폼별 버전을 대상으로 하여 더 많은 API 또는 기능을 조명할 수도 있습니다.
TFM의 OS 버전
OS 관련 TFM 종료 시 선택적 OS 버전을 지정할 수도 있습니다(예: net6.0-ios15.0
). 버전은 앱 또는 라이브러리에서 사용할 수 있는 API를 나타냅니다. 앱이나 라이브러리가 런타임에 지원하는 OS 버전을 제어하지 않습니다. 프로젝트에서 컴파일하는 참조 어셈블리를 선택하고 NuGet 패키지에서 자산을 선택하는 데 사용됩니다. 이 버전을 “플랫폼 버전” 또는 “OS API 버전”으로 생각하여 런타임 OS 버전과 명확하게 구분합니다.
.NET SDK는 새 버전의 기본 TFM 없이 개별 플랫폼에 대해 새로 릴리스된 API를 지원할 수 있도록 디자인되었습니다. 이렇게 하면 .NET의 주 릴리스를 기다리지 않고 플랫폼 관련 기능에 액세스할 수 있습니다. TFM에서 플랫폼 버전을 증분시켜 해당하는 새로 릴리스된 API에 액세스할 수 있습니다. 예를 들어 Android 플랫폼이 .NET 6.0.x SDK 업데이트에 API 수준 32 API를 추가한 경우 TFM net6.0-android32.0
을 사용하여 액세스할 수 있습니다.
OS 관련 TFM이 플랫폼 버전을 명시적으로 지정하지 않으면 기본 TFM 및 플랫폼 이름에서 유추할 수 있는 암시적 값을 포함합니다. 예를 들어, .NET 9에서 Android에 대한 기본 플랫폼 버전은 35.0
이며, 이는 정식 net9.0-android
TFM의 약식인 netp.0-android35.0
을 의미합니다. 축약형 형식은 프로젝트 파일에서만 사용되어야 하며 NuGet 같은 다른 도구에 전달되기 전에 .NET SDK의 MSBuild 대상에 의해 정식 양식으로 확장됩니다.
다음 표에서는 각 .NET 릴리스에 대한 기본 TPV(대상 플랫폼 버전)를 보여 줍니다. 최신 바인딩을 사용하려면 기본값(즉, OS 버전을 지정하지 않음)을 사용합니다.
.NET 버전 | 안드로이드 | 아이폰 OS | Mac Catalyst | macOS | tvOS | Tizen | 윈도우즈 |
---|---|---|---|---|---|---|---|
.NET 8 | 34.0 | 17.2 | 17.2 | 14.2 | 17.1 | 10.0 | 7.0 |
.NET 9 | 35.0 | 18.0 | 18.0 | 15.0 | 10.0 | 7.0 |
.NET 9부터 서비스 릴리스에서 이후 TPV에 대한 지원이 도입될 때(.NET 버전이 처음 릴리스되었을 때와 항상 동일한 주 버전 번호가 있음) 해당 .NET 버전에 대해 지원되는 가장 빠른 TPV는 계속 지원됩니다. 예를 들어 .NET 9의 경우 서비스 릴리스에서 최신 iOS 18.x 버전에 대한 지원을 추가하는 경우에도 지원되는 가장 빠른 iOS 버전인 18.0은 계속 지원됩니다. .NET 릴리스에 가장 빠른 바인딩을 사용해야 하는 경우 TFM에서 특정 OS 버전 번호를 사용합니다.
참고
.NET 8 이하의 Apple 플랫폼(iOS, macOS, tvOS 및 Mac Catalyst)에서 기본 TPV는 현재 설치된 워크로드에서 지원되는 최신 버전입니다. 즉, 예를 들어 .NET 8에서 iOS 워크로드를 업데이트하면 해당 워크로드에 새 버전의 iOS에 대한 지원이 추가된 경우 더 높은 기본 TPV가 발생할 수 있습니다. 앞의 표에서 기본 TPV는 명시된 .NET 버전의 초기 릴리스 버전입니다.
.NET 9부터 이 특수 동작은 실행 가능한 프로젝트에만 적용됩니다. 이제 라이브러리 프로젝트에 대한 기본 TPV는 다른 모든 플랫폼과 마찬가지로 주요 .NET 릴리스 전체에 대해 동일하게 유지됩니다.
우선 순위
앱이 다양한 타겟 프레임워크 모니커(TFM)에 대한 여러 자산이 있는 패키지를 참조하는 경우, 버전 번호가 더 가까운 자산이 우선 사용됩니다. 예를 들어, 앱이 net6.0-ios
를 대상으로 하고 패키지가 net6.0
및 net5.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
값은 플랫폼 관련 앱 패키징 및 빌드 프로세스에 영향을 주며, 해당 플랫폼에 관한 설명서에서 다룹니다.
다음은 TargetFramework
및 SupportedOSPlatformVersion
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 9를 대상으로 지정하는 방법을 보여 줍니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
</PropertyGroup>
</Project>
여러 대상 프레임워크를 지정하는 경우 각 대상 프레임워크에 대한 어셈블리를 조건에 따라 참조할 수 있습니다. 코드에서는 if-then-else 논리에 전처리기 기호를 사용하여 해당 어셈블리를 조건에 따라 컴파일할 수 있습니다.
다음 라이브러리 프로젝트는 .NET Standard(netstandard1.4
)의 API 및 .NET Framework(net40
및 net45
)의 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에서 사용 가능) |
플랫폼 기호 (사용 가능 여부) 운영 체제에 특화된 TFM을 지정할 때) |
---|---|---|---|
.NET Framework |
NETFRAMEWORK , NET481 , 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 , NET9_0 , NET8_0 , NET7_0 , NET6_0 , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_2 NETCOREAPP2_1 NETCOREAPP2_0 NETCOREAPP1_1 ,NETCOREAPP1_0 |
NET9_0_OR_GREATER , 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 |
승리 | netcore45 |
윈도우 8 | netcore45 |
윈도우 8.1 | netcore451 |
윈도우 10 | uap10.0 |
winrt | netcore45 |
참고 항목
.NET