Bagikan melalui


Kerangka kerja target dalam proyek gaya SDK

Saat menargetkan kerangka kerja di aplikasi atau pustaka, Anda menentukan kumpulan API yang ingin Anda sediakan untuk aplikasi atau pustaka. Anda menentukan kerangka kerja target dalam file proyek Anda menggunakan moniker kerangka kerja target (TFM).

Aplikasi atau pustaka dapat menargetkan versi .NET Standard. Versi Standar .NET mewakili set API standar di semua implementasi .NET. Misalnya, pustaka dapat menargetkan .NET Standard 1.6 dan mendapatkan akses ke API yang berfungsi di .NET Core dan .NET Framework menggunakan basis kode yang sama.

Aplikasi atau pustaka juga dapat menargetkan implementasi .NET tertentu untuk mendapatkan akses ke API khusus implementasi. Misalnya, aplikasi yang menargetkan Universal Windows Platform (UWP, uap10.0) memiliki akses ke API yang dikompilasi untuk perangkat yang menjalankan Windows 10.

Untuk beberapa kerangka kerja target, seperti .NET Framework, API ditentukan oleh assembly yang diinstal kerangka kerja pada sistem dan dapat mencakup API kerangka kerja aplikasi (misalnya, ASP.NET).

Untuk kerangka kerja target berbasis paket (misalnya, .NET 5+, .NET Core, dan .NET Standard), API ditentukan oleh paket NuGet yang disertakan dalam aplikasi atau pustaka.

Versi terbaru

Tabel berikut mendefinisikan kerangka kerja target yang paling umum, bagaimana kerangka kerja target direferensikan, dan versi .NET Standard mana yang mereka terapkan. Versi kerangka kerja target ini adalah versi stabil terbaru. Versi prarilis tidak ditampilkan. Moniker kerangka kerja target (TFM) adalah format token standar untuk menentukan kerangka kerja target dari sebuah aplikasi atau pustaka .NET.

Kerangka kerja target Terbaru
versi stabil
Identitas kerangka kerja target (TFM) Dilaksanakan
Versi Standar .NET
.NET 10 10 net10.0 2.1
.NET 9 9 net9.0 2.1
.NET 8 8 net8.0 2.1
.NET Standar 2.1 netstandard2.1 Tidak Berlaku
.NET Core 3.1 netcoreapp3.1 2.1
.NET Framework 4.8.1 net481 2.0

Kerangka target yang didukung

Kerangka kerja target biasanya disebut sebagai TFM. Tabel berikut ini memperlihatkan kerangka kerja target yang didukung oleh .NET SDK dan klien NuGet. Setara ditampilkan dalam tanda kurung. Misalnya, win81 setara dengan TFM yang setara dengan netcore451.

Kerangka Kerja Target TFM
.NET 5+ (dan .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*
net10.0*
.NET Standar 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
Toko Windows netcore [netcore45]
netcore45 [win] [win8]
netcore451 [win81]
.NET nanoFramework netnano1.0
.NET Kerangka kerja Mikro netmf
Silverlight sl4
sl5
Windows Phone wp [wp7]
wp7
wp75
wp8
wp81
wpa81
Platform Windows Universal uap [uap10.0]
uap10.0 [win10] [netcore50]

* .NET 5 dan TFM yang lebih baru mencakup beberapa variasi khusus sistem operasi. Untuk informasi selengkapnya, lihat bagian berikut, TFM khusus OS.

TFM khusus OS

net8.0TFM , net9.0, dan net10.0 mencakup teknologi yang berfungsi di berbagai platform. Menentukan TFM khusus OS memungkinkan API yang spesifik untuk sistem operasi tersedia untuk aplikasi Anda, misalnya, Windows Forms atau pengikatan iOS. TFM khusus OS juga mewarisi setiap API yang tersedia untuk TFM dasar mereka, misalnya, net10.0 TFM.

Tabel berikut ini memperlihatkan kompatibilitas TFM .NET 8+.

TFM Kompatibel dengan
net8.0 (Versi berikutnya dari net7.0)
net8.0-android (Versi berikutnya dari net7.0-android)
net8.0-browser Segala sesuatu yang diwariskan dari net8.0
net8.0-ios (Versi berikutnya dari net7.0-ios)
net8.0-maccatalyst (Versi berikutnya dari net7.0-maccatalyst)
net8.0-macos (Versi berikutnya dari net7.0-macos)
net8.0-tizen (Versi berikutnya dari net7.0-tizen)
net8.0-tvos (Versi berikutnya dari net7.0-tvos)
net8.0-windows (Versi berikutnya dari net7.0-windows)
net9.0 (Versi berikutnya dari net8.0)
net9.0-android (Versi berikutnya dari net8.0-android)
net9.0-browser (Versi berikutnya dari net8.0-browser)
net9.0-ios (Versi berikutnya dari net8.0-ios)
net9.0-maccatalyst (Versi berikutnya dari net8.0-maccatalyst)
net9.0-macos (Versi berikutnya dari net8.0-macos)
net9.0-tizen (Versi berikutnya dari net8.0-tizen)
net9.0-tvos (Versi berikutnya dari net8.0-tvos)
net9.0-windows (Versi berikutnya dari net8.0-windows)
net10.0 (Versi berikutnya dari net9.0)
net10.0-android (Versi berikutnya dari net9.0-android)
net10.0-browser (Versi berikutnya dari net9.0-browser)
net10.0-ios (Versi berikutnya dari net9.0-ios)
net10.0-maccatalyst (Versi berikutnya dari net9.0-maccatalyst)
net10.0-macos (Versi berikutnya dari net9.0-macos)
net10.0-tizen (Versi berikutnya dari net9.0-tizen)
net10.0-tvos (Versi berikutnya dari net9.0-tvos)
net10.0-windows (Versi berikutnya dari net9.0-windows)

Untuk membuat aplikasi Anda portabel di berbagai platform tetapi masih memiliki akses ke API khusus OS, Anda dapat menargetkan beberapa TFM khusus OS dan menambahkan pengaman platform untuk panggilan API khusus OS menggunakan #if arahan praprosesor. Untuk daftar simbol yang tersedia, lihat Simbol pra-prosesor.

Target yang disarankan

Gunakan panduan ini untuk menentukan TFM mana yang akan digunakan di aplikasi Anda:

  • Aplikasi yang portabel ke beberapa platform harus menargetkan TFM dasar, misalnya, net10.0. Ini termasuk sebagian besar pustaka tetapi juga ASP.NET Core dan Entity Framework.
  • Pustaka spesifik platform harus menargetkan varian spesifik platform. Misalnya, proyek WinForms dan WPF harus menargetkan net10.0-windows.
  • Model aplikasi lintas platform (misalnya, ASP.NET Core) harus setidaknya menargetkan TFM dasar, seperti net10.0. Namun, bisa juga menargetkan varian tambahan khusus platform untuk mengaktifkan lebih banyak API atau fitur.

Versi OS dalam TFMs

Anda juga dapat menentukan versi OS opsional di akhir TFM khusus OS, misalnya, net8.0-ios17.2. Versi menunjukkan API mana yang tersedia untuk aplikasi atau pustaka Anda. Ini tidak mengontrol versi OS yang didukung aplikasi atau pustaka Anda saat runtime. Ini digunakan untuk memilih perpustakaan referensi yang digunakan proyek Anda untuk kompilasi, dan untuk memilih aset dari paket NuGet. Anggap versi ini sebagai "versi platform" atau "versi OS API" untuk membedakannya dari versi OS runtime.

.NET SDK dirancang untuk dapat mendukung API yang baru dirilis untuk platform individual tanpa versi baru TFM dasar. Ini memungkinkan Anda mengakses fungsionalitas khusus platform tanpa menunggu rilis utama .NET. Anda dapat memperoleh akses ke API yang baru dirilis ini dengan menambah versi platform di TFM. Misalnya, jika platform Android menambahkan API level 34 API dalam pembaruan SDK .NET 8.0.x, Anda dapat mengaksesnya dengan menggunakan TFM net8.0-android34.0.

Ketika TFM khusus OS tidak menentukan versi platform secara eksplisit, TFM tersebut memiliki nilai tersirat yang dapat disimpulkan dari TFM dasar dan nama platform. Misalnya, versi platform default untuk Android di .NET 9 adalah 35.0, yang berarti bahwa net9.0-android adalah singkatan dari TFM standar net9.0-android35.0. Formulir singkatan dimaksudkan untuk digunakan dalam file proyek saja, dan diperluas ke bentuk kanonis oleh target MSBuild .NET SDK sebelum diteruskan ke alat lain, seperti NuGet.

Tabel berikut menunjukkan versi platform target (TPV) default untuk Android dan iOS untuk setiap rilis .NET. Jika Anda ingin menggunakan pengikatan terbaru, gunakan default (yaitu, jangan tentukan versi OS).

Versi .NET Android Ios
.NET 8 34,0 17.2
.NET 9 35,0 18,0
.NET 10 36.0 18.7

Mulai dari .NET 9, ketika rilis layanan memperkenalkan dukungan untuk TPV yang lebih baru (yang akan selalu memiliki nomor versi utama yang sama seperti ketika versi .NET awalnya dirilis), TPV yang didukung paling awal untuk versi .NET tersebut akan tetap didukung. Misalnya, untuk .NET 9, versi iOS paling awal yang didukung, 18.0, akan tetap didukung, bahkan ketika rilis layanan menambahkan dukungan untuk versi iOS 18.x terbaru. Jika Anda perlu menggunakan pengikatan paling awal untuk rilis .NET, gunakan nomor versi OS tertentu di TFM Anda.

Catatan

Pada platform Apple (iOS, macOS, tvOS, dan Mac Catalyst) di .NET 8 dan yang lebih lama, TPV default adalah versi terbaru yang didukung dalam beban kerja yang saat ini diinstal. Itu berarti bahwa memperbarui beban kerja iOS di .NET 8, misalnya, dapat mengakibatkan TPV default yang lebih tinggi, jika dukungan untuk versi baru iOS telah ditambahkan dalam beban kerja tersebut. Dalam tabel sebelumnya, TPV default adalah versi dalam rilis awal untuk versi .NET yang dinyatakan.

Mulai dari .NET 9, perilaku khusus ini hanya berlaku untuk proyek yang dapat dieksekusi . TPV default untuk proyek pustaka sekarang tetap sama untuk keseluruhan rilis .NET utama, seperti semua platform lainnya.

Prioritas

Jika aplikasi Anda mereferensikan paket yang memiliki beberapa aset untuk TFM yang berbeda, aset yang lebih dekat dengan nomor versi lebih disukai. Misalnya, jika aplikasi Anda menargetkan net9.0-ios dan paket menawarkan aset untuk net9.0 dan net8.0-ios, net9.0 aset digunakan. Untuk informasi selengkapnya, lihat Prioritas.

Mendukung versi OS yang lebih lama

Meskipun aplikasi atau pustaka khusus platform dikompilasi terhadap API dari versi OS tertentu, Anda dapat membuatnya kompatibel dengan versi OS sebelumnya dengan menambahkan SupportedOSPlatformVersion properti ke file proyek Anda. Properti SupportedOSPlatformVersion menunjukkan versi OS minimum yang diperlukan untuk menjalankan aplikasi atau pustaka Anda. Jika Anda tidak secara eksplisit menentukan versi OS runtime minimum ini dalam proyek, versi tersebut default ke versi platform dari TFM.

Agar aplikasi Anda berjalan dengan benar pada versi OS yang lebih lama, aplikasi tidak dapat memanggil API yang tidak ada pada versi OS tersebut. Namun, Anda dapat menambahkan pengamanan di sekitar pemanggilan API yang lebih baru sehingga hanya dipanggil saat OS dijalankan pada versi yang mendukungnya. Pola ini memungkinkan Anda merancang aplikasi atau pustaka untuk mendukung berjalan pada versi OS yang lebih lama sambil memanfaatkan fungsionalitas OS yang lebih baru saat berjalan pada versi OS yang lebih baru.

Nilai SupportedOSPlatformVersion (baik eksplisit atau default) digunakan oleh penganalisis kompatibilitas platform, yang mendeteksi dan memperingatkan tentang panggilan yang tidak dijaga ke API yang lebih baru. Ini tertanam ke dalam assembly yang dikompilasi proyek sebagai atribut assembly UnsupportedOSPlatformAttribute, sehingga penganalisis kompatibilitas platform dapat mendeteksi panggilan tanpa perlindungan ke API assembly tersebut dari proyek dengan nilai yang lebih rendah SupportedOSPlatformVersion. Pada beberapa platform, nilai SupportedOSPlatformVersion tersebut memengaruhi proses pengemasan dan pembangunan aplikasi yang khusus untuk platform tersebut, yang dibahas dalam dokumentasi untuk platform-platform tersebut.

Contoh berikut adalah kutipan file proyek yang menggunakan TargetFramework properti MSBuild dan SupportedOSPlatformVersion untuk menentukan bahwa aplikasi atau pustaka memiliki akses ke API iOS 15.0 tetapi mendukung berjalan di iOS 13.0 dan yang lebih tinggi:

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

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

</Project>

Cara menentukan kerangka kerja target

Kerangka kerja target ditentukan dalam file proyek. Saat kerangka kerja target tunggal ditentukan, gunakan elemen TargetFramework. File proyek aplikasi konsol berikut menunjukkan cara menargetkan .NET 10:

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

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

</Project>

Saat menentukan beberapa kerangka kerja target, Anda dapat mereferensikan rakitan secara kondisional untuk setiap kerangka kerja target. Dalam kode Anda, Anda dapat mengkompilasi secara kondisional terhadap rakitan tersebut dengan menggunakan simbol prapemrosesan dengan logika if-then-else .

Proyek pustaka berikut menargetkan API .NET Standard (netstandard1.4) dan .NET Framework (net40 dan net45). Gunakan elemen TargetFrameworks dalam bentuk jamak dengan beberapa kerangka kerja target. Atribut Condition termasuk paket khusus implementasi ketika pustaka dikompilasi untuk dua TFM pada .NET Framework:

<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>

Dalam pustaka atau aplikasi, Anda menulis kode kondisional menggunakan direktif pra-prosesor untuk dikompilasi untuk setiap kerangka kerja target:

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
    }
}

Simbol prapemroscesor

Sistem build mengetahui simbol pra-prosesor yang mewakili kerangka kerja target yang ditampilkan dalam tabel Versi kerangka kerja target yang didukung saat Anda menggunakan proyek bergaya SDK. Untuk mengonversi .NET Standard, .NET Core, atau .NET 5+ TFM ke simbol praprosesor, ganti titik dan tanda hubung dengan garis bawah, dan ubah huruf kecil menjadi huruf besar (misalnya, simbol untuk netstandard2.0 adalah NETSTANDARD2_0).

Anda dapat menonaktifkan pembuatan simbol-simbol ini melalui DisableImplicitFrameworkDefines properti. Untuk informasi selengkapnya tentang properti ini, lihat DisableImplicitFrameworkDefines.

Daftar lengkap simbol pra-prosesor untuk kerangka kerja target .NET adalah:

Kerangka Kerja Target Simbol Simbol tambahan
(tersedia dalam .NET 5+ SDK)
Simbol-simbol platform (tersedia hanya
saat Anda menentukan TFM khusus OS)
.NET Framework NETFRAMEWORK, , NET481, NET48NET472, NET471, NET47, NET462, NET461, NET46, NET452, NET451, NET45, , NET40, NET35NET20 NET48_OR_GREATER, , NET472_OR_GREATERNET471_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_GREATERNET20_OR_GREATER
.NET Standar NETSTANDARD, NETSTANDARD2_1NETSTANDARD2_0, NETSTANDARD1_6, NETSTANDARD1_5, NETSTANDARD1_4, NETSTANDARD1_3, NETSTANDARD1_2, NETSTANDARD1_1,NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATERNETSTANDARD1_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+ (dan .NET Core) NET, , NET10_0, NET9_0NET8_0, NET7_0, NET6_0, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, , NETCOREAPP2_0, NETCOREAPP1_1NETCOREAPP1_0 NET10_0_OR_GREATER, , NET9_0_OR_GREATERNET8_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_GREATERNETCOREAPP1_0_OR_GREATER ANDROID, , BROWSERIOS, MACCATALYST, MACOS, TVOS, , WINDOWS,
[OS][version] (misalnya IOS15_1),
[OS][version]_OR_GREATER (misalnya IOS15_1_OR_GREATER)

Catatan

  • Simbol tanpa versi didefinisikan tanpa memperhatikan versi yang Anda targetkan.
  • Simbol khusus versi hanya ditentukan untuk versi yang Anda targetkan.
  • Simbol <framework>_OR_GREATER ditentukan untuk versi yang Anda targetkan dan semua versi sebelumnya. Misalnya, jika Anda menargetkan .NET Framework 2.0, simbol berikut ditentukan: NET20, NET20_OR_GREATER, NET11_OR_GREATER, dan NET10_OR_GREATER.
  • Simbol NETSTANDARD<x>_<y>_OR_GREATER hanya didefinisikan untuk target .NET Standard, dan bukan untuk target yang mengimplementasikan .NET Standard, seperti .NET Core dan .NET Framework.
  • Ini berbeda dari moniker kerangka kerja target (TFM) yang digunakan dalam properti MSBuild TargetFramework dan NuGet.

Kerangka kerja target yang tidak lagi digunakan

Kerangka kerja target berikut tidak digunakan lagi. Paket yang menargetkan kerangka kerja target ini harus bermigrasi ke pengganti yang ditunjukkan.

TFM yang tidak digunakan lagi Penggantian
aspnet50
aspnetcore50
dnxcore50
dnx
dnx45
dnx451
dnx452
netcoreapp
dotnet
dotnet50
dotnet51
dotnet52
dotnet53
dotnet54
dotnet55
dotnet56
netstandard
netcore50 uap10.0
menang netcore45
Windows 8 netcore45
Windows 8.1 netcore451
Windows 10 uap10.0
winrt netcore45

Lihat juga