Platformy docelowe w projektach w stylu zestawu SDK

W przypadku określania struktury w aplikacji lub bibliotece określasz zestaw interfejsów API, które mają być dostępne dla aplikacji lub biblioteki. Należy określić strukturę docelową w pliku projektu przy użyciu nazwy docelowej platformy (TFM).

Aplikacja lub biblioteka może kierować do wersji platformy .NET Standard. Wersje platformy .NET Standard reprezentują standardowe zestawy interfejsów API we wszystkich implementacjach platformy .NET. Na przykład biblioteka może kierować do platformy .NET Standard 1.6 i uzyskiwać dostęp do interfejsów API, które działają na platformach .NET Core i .NET Framework przy użyciu tej samej bazy kodu.

Aplikacja lub biblioteka może również kierować określoną implementację platformy .NET w celu uzyskania dostępu do interfejsów API specyficznych dla implementacji. Na przykład aplikacja przeznaczona dla platformy Xamarin.iOS (na przykład Xamarin.iOS10) ma dostęp do otoek interfejsów API systemu iOS udostępnianych przez platformę Xamarin dla systemu iOS 10 lub aplikacji przeznaczonej dla platforma uniwersalna systemu Windows (UWP, uap10.0) ma dostęp do interfejsów API kompilowanych dla urządzeń z systemem Windows 10.

W przypadku niektórych platform docelowych, takich jak .NET Framework, interfejsy API są definiowane przez zestawy instalowane przez platformę w systemie i mogą obejmować interfejsy API platformy aplikacji (na przykład ASP.NET).

W przypadku platform docelowych opartych na pakietach (na przykład .NET 5+, .NET Core i .NET Standard) interfejsy API są definiowane przez pakiety NuGet zawarte w aplikacji lub bibliotece.

Najnowsze wersje

W poniższej tabeli zdefiniowano najbardziej typowe platformy docelowe, sposób ich odwołowania się oraz wersję implementowanej przez nich wersji platformy .NET Standard . Te wersje platformy docelowej są najnowszymi stabilnymi wersjami. Wersje wstępne nie są wyświetlane. Moniker platformy docelowej (TFM) to standardowy format tokenu określający platformę docelową aplikacji lub biblioteki platformy .NET.

Platforma docelowa Najnowsza
stabilna wersja
Nazwa platformy docelowej (TFM) Zaimplementowana
Wersja platformy .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 Nie dotyczy
.NET Core 3.1 netcoreapp3.1 2.1
.NET Framework 4.8.1 net481 2.0

Obsługiwane platformy docelowe

Platforma docelowa zwykle odwołuje się do serwera TFM. W poniższej tabeli przedstawiono platformy docelowe obsługiwane przez zestaw .NET SDK i klienta NuGet. Odpowiedniki są wyświetlane w nawiasach kwadratowych. Na przykład win81 jest odpowiednikiem serwera TFM do netcore451.

Struktura docelowa TFM
.NET 5+ (i .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
Sklep Windows netcore [netcore45]
netcore45 [win] [win8]
netcore451 [win81]
.NET Micro Framework netmf
Silverlight sl4
sl5
Windows Phone wp [wp7]
wp7
wp75
wp8
wp81
wpa81
Platforma uniwersalna systemu Windows uap [uap10.0]
uap10.0 [win10] [netcore50]

* Program .NET 5 lub nowszy serwer TFM zawiera pewne odmiany specyficzne dla systemu operacyjnego. Aby uzyskać więcej informacji, zobacz następującą sekcję : .NET 5+ OS specyficzne dla serwera TFMs.

Programy TFM specyficzne dla systemu operacyjnego .NET 5+

Systemy net5.0, net6.0, net7.0i net8.0 TFM obejmują technologie, które działają na różnych platformach. Określenie specyficznego dla systemu operacyjnego serwera TFM sprawia, że interfejsy API specyficzne dla systemu operacyjnego są dostępne dla aplikacji, na przykład powiązania systemu Windows Forms lub iOS. Maszyny TFM specyficzne dla systemu operacyjnego dziedziczą również każdy interfejs API dostępny dla podstawowego net6.0 serwera TFM, na przykład tfM.

Platforma .NET 5 wprowadziła net5.0-windows specyficzny dla systemu operacyjnego program TFM, który obejmuje powiązania specyficzne dla systemu Windows dla interfejsów API WinForms, WPF i UWP. Program .NET 6 i nowsze wersje mają dodatkowe maszyny TFM specyficzne dla systemu operacyjnego, na przykład net6.0-ios.

W poniższej tabeli przedstawiono zgodność programu .NET 5+ TFMs.

TFM Zgodność z
net5.0 net1.. 4 (z ostrzeżeniem NU1701)
netcoreapp1.. 3.1 (ostrzeżenie, gdy odwołano się do winForms lub WPF)
netstandard1.. 2.1
net5.0-windows netcoreapp1.. 3.1 (plus wszystkie inne elementy dziedziczone z net5.0)
net6.0 (Kolejna wersja programu net5.0)
net6.0-android xamarin.android (plus wszystkie inne elementy dziedziczone z net6.0)
net6.0-ios xamarin.ios (plus wszystkie inne elementy dziedziczone z net6.0)
net6.0-maccatalyst xamarin.ios (plus wszystkie inne elementy dziedziczone z net6.0)
net6.0-macos xamarin.mac (plus wszystkie inne elementy dziedziczone z net6.0)
net6.0-tvos xamarin.tvos (plus wszystkie inne elementy dziedziczone z net6.0)
net6.0-windows (Kolejna wersja programu net5.0-windows)
net7.0 (Kolejna wersja programu net6.0)
net7.0-android (Kolejna wersja programu net6.0-android)
net7.0-ios (Kolejna wersja programu net6.0-ios)
net7.0-maccatalyst (Kolejna wersja programu net6.0-maccatalyst)
net7.0-macos (Kolejna wersja programu net6.0-macos)
net7.0-tizen tizen40 (plus wszystkie inne elementy dziedziczone z net7.0)
net7.0-tvos (Kolejna wersja programu net6.0-tvos)
net7.0-windows (Kolejna wersja programu net6.0-windows)
net8.0 (Kolejna wersja programu net7.0)
net8.0-android (Kolejna wersja programu net7.0-android)
net8.0-browser Wszystko dziedziczone z net8.0
net8.0-ios (Kolejna wersja programu net7.0-ios)
net8.0-maccatalyst (Kolejna wersja programu net7.0-maccatalyst)
net8.0-macos (Kolejna wersja programu net7.0-macos)
net8.0-tizen (Kolejna wersja programu net7.0-tizen)
net8.0-tvos (Kolejna wersja programu net7.0-tvos)
net8.0-windows (Kolejna wersja programu net7.0-windows)

Aby aplikacja mogła być przenośna na różnych platformach, ale nadal ma dostęp do interfejsów API specyficznych dla systemu operacyjnego, możesz kierować wiele serwerów TFM specyficznych dla systemu operacyjnego i dodawać osłony platformy wokół wywołań interfejsu API specyficznych dla systemu operacyjnego przy użyciu #if dyrektyw preprocesora. Aby uzyskać listę dostępnych symboli, zobacz Symbole preprocesora.

Sugerowane elementy docelowe

Skorzystaj z poniższych wskazówek, aby określić, który program TFM ma być używany w aplikacji:

  • Aplikacje przenośne z wieloma platformami powinny być przeznaczone dla podstawowego serwera TFM, na przykład net8.0. Obejmuje to większość bibliotek, ale także ASP.NET Core i Entity Framework.

  • Biblioteki specyficzne dla platformy powinny być przeznaczone dla odmian specyficznych dla platformy. Na przykład projekty WinForms i WPF powinny być przeznaczone dla elementu .net8.0-windows

  • Międzyplatformowe modele aplikacji (Xamarin Forms, ASP.NET Core) i pakiety mostkowe (Xamarin Essentials) powinny być co najmniej przeznaczone dla podstawowego programu TFM, na przykład net8.0, ale mogą być również przeznaczone dla dodatkowych odmian specyficznych dla platformy, aby rozświetlić więcej interfejsów API lub funkcji.

Wersja systemu operacyjnego w programie TFMs

Możesz również określić opcjonalną wersję systemu operacyjnego na końcu programu TFM specyficznego dla systemu operacyjnego, na przykład net6.0-ios15.0. Wersja wskazuje, które interfejsy API są dostępne dla aplikacji lub biblioteki. Nie kontroluje wersji systemu operacyjnego obsługiwanej przez aplikację lub bibliotekę w czasie wykonywania. Służy do wybierania zestawów referencyjnych kompilowanych przez projekt i wybierania zasobów z pakietów NuGet. Należy traktować tę wersję jako "wersję platformy" lub "wersję interfejsu API systemu operacyjnego", aby uściślić ją z wersji systemu operacyjnego w czasie wykonywania.

Jeśli program TFM specyficzny dla systemu operacyjnego nie określa jawnie wersji platformy, ma dorozumianą wartość, którą można wywnioskować z podstawowego serwera TFM i nazwy platformy. Na przykład domyślna wartość platformy dla systemu iOS na platformie .NET 6 to 15.0, co oznacza, że net6.0-ios jest to skrót kanonicznego net6.0-ios15.0 serwera TFM. Dorozumiana wersja platformy dla nowszego podstawowego serwera TFM może być wyższa, na przykład przyszłego net8.0-ios serwera TFM może być mapowane na net8.0-ios16.0. Skrócony formularz jest przeznaczony tylko do użycia w plikach projektu i jest rozszerzany do formularza kanonicznego przez cele MSBuild zestawu SDK platformy .NET przed przekazaniem do innych narzędzi, takich jak NuGet.

W poniższej tabeli przedstawiono domyślne wartości platformy docelowej (TPV) dla każdej wersji platformy .NET.

Wersja platformy .NET Platforma Domyślny protokół 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 Katalizator mac 15.0
.NET 7 Katalizator mac 16.1
.NET 8 Katalizator mac 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

Zestaw SDK platformy .NET został zaprojektowany tak, aby umożliwić obsługę nowo wydanych interfejsów API dla poszczególnych platform bez nowej wersji podstawowego serwera TFM. Dzięki temu można uzyskać dostęp do funkcji specyficznych dla platformy bez oczekiwania na główną wersję platformy .NET. Dostęp do tych nowo wydanych interfejsów API można uzyskać, zwiększając wersję platformy w programie TFM. Jeśli na przykład platforma iOS dodała interfejsy API systemu iOS 15.1 w aktualizacji zestawu SDK platformy .NET 6.0.x, możesz uzyskać do nich dostęp przy użyciu programu TFM net6.0-ios15.1.

Pierwszeństwo

Jeśli aplikacja odwołuje się do pakietu z wieloma elementami zawartości dla różnych serwerów TFM, preferowane są zasoby, które znajdują się bliżej numeru wersji. Jeśli na przykład aplikacja jest docelowa net6.0-ios , a pakiet oferuje zasoby dla net6.0 elementów i net5.0-ios, net6.0 używane są zasoby. Aby uzyskać więcej informacji, zobacz Pierwszeństwo.

Obsługa starszych wersji systemu operacyjnego

Mimo że aplikacja lub biblioteka specyficzna dla platformy jest kompilowana względem interfejsów API z określonej wersji tego systemu operacyjnego, można ją zapewnić zgodność z wcześniejszymi wersjami systemu operacyjnego, dodając SupportedOSPlatformVersion właściwość do pliku projektu. Właściwość SupportedOSPlatformVersion wskazuje minimalną wersję systemu operacyjnego wymaganą do uruchomienia aplikacji lub biblioteki. Jeśli nie określisz jawnie tej minimalnej wersji systemu operacyjnego w czasie wykonywania w projekcie, zostanie ona domyślnie ustawiona na wersję platformy z programu TFM.

Aby aplikacja mogła działać poprawnie w starszej wersji systemu operacyjnego, nie może wywołać interfejsów API, które nie istnieją w tej wersji systemu operacyjnego. Można jednak dodać osłony wokół wywołań do nowszych interfejsów API, aby były wywoływane tylko w przypadku uruchamiania w wersji systemu operacyjnego, która je obsługuje. Ten wzorzec umożliwia zaprojektowanie aplikacji lub biblioteki do obsługi uruchamiania w starszych wersjach systemu operacyjnego przy jednoczesnym wykorzystaniu nowszych funkcji systemu operacyjnego podczas uruchamiania w nowszych wersjach systemu operacyjnego.

Wartość SupportedOSPlatformVersion (określana jako jawna lub domyślna) jest używana przez analizator zgodności platformy, który wykrywa i ostrzega przed niestrzeżonymi wywołaniami nowszych interfejsów API. Jest on spalony do skompilowanego zestawu projektu jako UnsupportedOSPlatformAttribute atrybutu zestawu, dzięki czemu analizator zgodności platformy może wykrywać niestrzeżone wywołania interfejsów API tego zestawu z projektów o niższej SupportedOSPlatformVersion wartości. Na niektórych platformach SupportedOSPlatformVersion wartość ma wpływ na procesy tworzenia i tworzenia aplikacji specyficzne dla platformy, które zostały omówione w dokumentacji dla tych platform.

Oto przykładowy fragment pliku projektu, który używa TargetFramework właściwości i SupportedOSPlatformVersion MSBuild do określenia, że aplikacja lub biblioteka ma dostęp do interfejsów API systemu iOS 15.0, ale obsługuje uruchamianie w systemie iOS 13.0 lub nowszym:

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

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

</Project>

Jak określić strukturę docelową

Struktury docelowe są określane w pliku projektu. Po określeniu pojedynczej platformy docelowej użyj elementu TargetFramework. Poniższy plik projektu aplikacji konsolowej przedstawia sposób kierowania platformy .NET 8:

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

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

</Project>

Podczas określania wielu platform docelowych można warunkowo odwoływać się do zestawów dla każdej platformy docelowej. W kodzie można warunkowo skompilować te zestawy przy użyciu symboli preprocesora z logiką if-then-else .

Poniższy projekt biblioteki jest przeznaczony dla interfejsów API platformy .NET Standard (netstandard1.4) i .NET Framework (net40 i net45). Użyj elementu TargetFrameworks w liczbie mnogiej z wieloma platformami docelowymi. Atrybuty Condition obejmują pakiety specyficzne dla implementacji, gdy biblioteka jest kompilowana dla dwóch programów TFM programu .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>

W bibliotece lub aplikacji piszesz kod warunkowy przy użyciu dyrektyw preprocesora w celu skompilowania dla każdej platformy docelowej:

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

Symbole preprocesora

System kompilacji zna symbole preprocesora reprezentujące platformy docelowe wyświetlane w tabeli Obsługiwane wersje platform docelowych podczas korzystania z projektów w stylu zestawu SDK. Aby przekonwertować program .NET Standard, .NET Core lub .NET 5+ TFM na symbol preprocesora, zastąp kropki i łączniki znakiem podkreślenia i zmień małe litery na wielkie litery (na przykład symbol dla netstandard1.4 elementu to NETSTANDARD1_4).

Generowanie tych symboli można wyłączyć za pomocą DisableImplicitFrameworkDefines właściwości . Aby uzyskać więcej informacji na temat tej właściwości, zobacz DisableImplicitFrameworkDefines.

Pełna lista symboli preprocesora dla platform docelowych .NET to:

Platformy docelowe Symbole Dodatkowe symbole
(dostępne w zestawach .NET 5+ SDK)
Symbole platformy (dostępne tylko
podczas określania programu TFM specyficznego dla systemu operacyjnego)
.NET Framework NETFRAMEWORK, NET48, , , NET47NET462NET40NET471NET46NET35NET461NET452NET451NET45NET472NET20 NET48_OR_GREATER, NET472_OR_GREATER, , , NET462_OR_GREATERNET452_OR_GREATERNET47_OR_GREATERNET46_OR_GREATERNET35_OR_GREATERNET461_OR_GREATERNET451_OR_GREATERNET45_OR_GREATERNET40_OR_GREATERNET471_OR_GREATERNET20_OR_GREATER
.NET Standard NETSTANDARD, NETSTANDARD2_1, , , NETSTANDARD1_5NETSTANDARD1_1NETSTANDARD1_6NETSTANDARD1_4NETSTANDARD1_3NETSTANDARD1_2NETSTANDARD2_0NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, , NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_4_OR_GREATERNETSTANDARD1_5_OR_GREATER, NETSTANDARD1_3_OR_GREATER, , NETSTANDARD1_1_OR_GREATERNETSTANDARD1_2_OR_GREATERNETSTANDARD1_0_OR_GREATER
.NET 5+ (i .NET Core) NET, NET8_0, , , NET5_0NETCOREAPP3_0NET6_0NETCOREAPP3_1NETCOREAPP1_1NETCOREAPPNETCOREAPP2_2NETCOREAPP2_1NETCOREAPP2_0NET7_0NETCOREAPP1_0 NET8_0_OR_GREATER, NET7_0_OR_GREATER, , , NETCOREAPP3_1_OR_GREATERNETCOREAPP2_1_OR_GREATERNETCOREAPP1_1_OR_GREATERNET5_0_OR_GREATERNETCOREAPP3_0_OR_GREATERNETCOREAPP2_2_OR_GREATERNETCOREAPP2_0_OR_GREATERNET6_0_OR_GREATERNETCOREAPP1_0_OR_GREATER ANDROID, BROWSER, , IOS, MACOSMACCATALYST, , TVOS, , WINDOWS
[OS][version] (na przykład IOS15_1),
[OS][version]_OR_GREATER (na przykład IOS15_1_OR_GREATER)

Uwaga

  • Symbole bez wersji są definiowane niezależnie od docelowej wersji.
  • Symbole specyficzne dla wersji są definiowane tylko dla docelowej wersji.
  • Symbole <framework>_OR_GREATER są definiowane dla docelowej wersji i wszystkich wcześniejszych wersji. Jeśli na przykład używasz platformy .NET Framework 2.0, zdefiniowane są następujące symbole: NET20, , NET20_OR_GREATERNET11_OR_GREATERi NET10_OR_GREATER.
  • Symbole NETSTANDARD<x>_<y>_OR_GREATER są definiowane tylko dla obiektów docelowych platformy .NET Standard, a nie dla obiektów docelowych implementujących platformę .NET Standard, takich jak .NET Core i .NET Framework.
  • Różnią się one od obiektów docelowych monikers (TFMs) używanych przez właściwość MSBuild TargetFramework i NuGet.

Przestarzałe struktury docelowe

Następujące platformy docelowe są przestarzałe. Pakiety przeznaczone dla tych platform docelowych powinny zostać zmigrowane do wskazanych zastąpień.

Przestarzały program TFM Zastąpienie
aspnet50
aspnetcore50
dnxcore50
Dnx
dnx45
dnx451
dnx452
netcoreapp
dotnet
dotnet50
dotnet51
dotnet52
dotnet53
dotnet54
dotnet55
dotnet56
netstandard
netcore50 uap10.0
Wygrać netcore45
win8 netcore45
win81 netcore451
win10 uap10.0
Winrt netcore45

Zobacz też