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 9 | 9 | net9.0 | 2.1 |
.NET 8 | 8 | net8.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 클라이언트에서 지원되는 대상 프레임워크를 보여 줍니다. 동일한 항목은 대괄호 내에 표시됩니다. 예를 들어 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* |
.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.0
net8.0
및 net.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
를 대상으로 지정해야 합니다. - 플랫폼 간 애플리케이션 모델(Xamarin Forms, ASP.NET Core) 및 브리지 팩(Xamarin Essentials)은 최소한 기본 TFM(예:
net9.0
)을 대상으로 지정해야 하지만 추가 플랫폼별 버전을 대상으로 지정하여 더 많은 API 또는 기능을 강화할 수도 있습니다.
TFM의 OS 버전
OS 관련 TFM 종료 시 선택적 OS 버전을 지정할 수도 있습니다(예: net6.0-ios15.0
). 버전은 앱 또는 라이브러리에서 사용할 수 있는 API를 나타냅니다. 앱이나 라이브러리가 런타임에 지원하는 OS 버전을 제어하지 않습니다. 프로젝트에서 컴파일하는 참조 어셈블리를 선택하고 NuGet 패키지에서 자산을 선택하는 데 사용됩니다. 이 버전을 “플랫폼 버전” 또는 “OS API 버전”으로 생각하여 런타임 OS 버전과 명확하게 구분합니다.
OS 관련 TFM이 플랫폼 버전을 명시적으로 지정하지 않으면 기본 TFM 및 플랫폼 이름에서 유추할 수 있는 암시적 값을 포함합니다. 예를 들어 .NET 6의 Android에 대한 기본 플랫폼 값은 31.0
net6.0-android
정식 net6.0-android31.0
TFM의 약어입니다. 최신 기본 TFM의 암시적 플랫폼 버전은 더 높을 수 있습니다. 예를 들어, 향후 net8.0-android
TFM은 net8.0-android34.0
에 매핑될 수 있습니다. 축약형 형식은 프로젝트 파일에서만 사용되어야 하며 NuGet 같은 다른 도구에 전달되기 전에 .NET SDK의 MSBuild 대상에 의해 정식 양식으로 확장됩니다.
다음 표에서는 각 .NET 릴리스에 대한 기본 TPV(대상 플랫폼 값)를 보여 줍니다.
.NET 버전 | Android | iOS | Mac Catalyst | macOS | tvOS | Tizen | Windows |
---|---|---|---|---|---|---|---|
.NET 8 | 34.0 | 17.2 | 17.2 | 14.2 | 17.1 | 7.0 | 10.0 |
.NET 9 | 35.0 | 18.0 | 18.0 | 15.0 | 7.0 | 10.0 |
참고 항목
.NET 8 이하의 Apple 플랫폼(iOS, macOS, tvOS 및 Mac Catalyst)에서 기본 TPV는 현재 설치된 워크로드에서 지원되는 최신 버전입니다. 즉, 예를 들어 .NET 8에서 iOS 워크로드를 업데이트하면 해당 워크로드에 새 버전의 iOS에 대한 지원이 추가된 경우 더 높은 기본 TPV가 발생할 수 있습니다. 앞의 표에서 기본 TPV는 명시된 .NET 버전에 대한 초기 릴리스의 TPV입니다.
.NET 9부터 이 특수 동작은 실행 가능한 프로젝트에만 적용됩니다. 이제 라이브러리 프로젝트에 대한 기본 TPV는 다른 모든 플랫폼과 마찬가지로 주요 .NET 릴리스 전체에 대해 동일하게 유지됩니다.
.NET SDK는 새 버전의 기본 TFM 없이 개별 플랫폼에 대해 새로 릴리스된 API를 지원할 수 있도록 디자인되었습니다. 이렇게 하면 .NET의 주 릴리스를 기다리지 않고 플랫폼 관련 기능에 액세스할 수 있습니다. TFM에서 플랫폼 버전을 증분시켜 해당하는 새로 릴리스된 API에 액세스할 수 있습니다. 예를 들어 Android 플랫폼이 .NET 6.0.x SDK 업데이트에 API 수준 32 API를 추가한 경우 TFM net6.0-android32.0
을 사용하여 액세스할 수 있습니다.
우선 순위
앱이 서로 다른 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에서 사용 가능) |
플랫폼 기호(OS별 TFM을 지정할 때만 사용 가능) |
---|---|---|---|
.NET Framework | NETFRAMEWORK , NET481 , NET48 , NET472 , NET471 , NET47 , , NET461 NET462 , 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_0 NETCOREAPP2_1 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 |
참고 항목
- .NET 5의 대상 프레임워크 이름
- 데스크톱 앱에서 Windows 런타임 API 호출
- 플랫폼 간 도구로 라이브러리 개발
- .NET Standard
- .NET Core 버전 관리
- NuGet Tools GitHub Repository(NuGet 도구 GitHub 리포지토리)
- Framework Profiles in .NET(.NET의 프레임워크 프로필)
- 플랫폼 호환성 분석기
.NET