Udostępnij przez


Docelowe platformy w projektach w stylu SDK

Jeśli wybierasz framework w aplikacji lub bibliotece, określasz zestaw interfejsów API, które mają być dostępne dla tej aplikacji lub biblioteki. Określasz platformę docelową w pliku projektu za pomocą identyfikatora platformy docelowej (TFM).

Aplikacja lub biblioteka może celować w wersję platformy .NET Standard. Wersje platformy .NET Standard reprezentują standardowe zestawy interfejsów API we wszystkich implementacjach platformy .NET. Na przykład biblioteka może być opracowana dla .NET Standard 1.6 i uzyskiwać dostęp do interfejsów API, które działają zarówno na platformie .NET Core, jak i .NET Framework, używając tej samej bazy kodu.

Aplikacja lub biblioteka może również celować w określoną implementację platformy .NET, aby uzyskać dostęp do specyficznych dla danej implementacji interfejsów API. Na przykład aplikacja przeznaczona dla platformy uniwersalnej systemu Windows (UWP, uap10.0) ma dostęp do interfejsów API skompilowanych 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 nazywania lub odwoływania się do nich oraz wersję .NET Standard, którą implementują. Te wersje platformy docelowej są najnowszymi stabilnymi wersjami. Wersje przedpremierowe nie są wyświetlane. Moniker platformy docelowej (TFM) to standardowy format tokenu służący do określania platformy docelowej aplikacji lub biblioteki .NET.

Platforma docelowa Najnowsze
stabilna wersja
Nazwa platformy docelowej (TFM) Zaimplementowana
Wersja platformy .NET Standard
.NET 10 10 net10.0 2.1
.NET 9 9 net9.0 2.1
.NET 8 8 net8.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

Docelowe środowisko jest zwykle określane jako TFM. W poniższej tabeli przedstawiono platformy docelowe obsługiwane przez zestaw .NET SDK i klienta NuGet. Odpowiedniki są wyświetlane w nawiasach. Na przykład win81 jest odpowiednikiem TFM dla netcore451.

Struktura docelowa moniker platformy docelowej
.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*
net9.0*
net10.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]
nanoFramework .NET netnano1.0
.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]

* .NET 5 i nowsze TFM zawierają pewne odmiany specyficzne dla systemu operacyjnego. Aby uzyskać więcej informacji, zobacz następującą sekcję, Specyficzne dla systemów operacyjnych TFMs.

Specyficzne dla systemu operacyjnego TFM

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

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

moniker platformy docelowej Kompatybilny z
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)
net9.0 (Kolejna wersja programu net8.0)
net9.0-android (Kolejna wersja programu net8.0-android)
net9.0-browser (Kolejna wersja programu net8.0-browser)
net9.0-ios (Kolejna wersja programu net8.0-ios)
net9.0-maccatalyst (Kolejna wersja programu net8.0-maccatalyst)
net9.0-macos (Kolejna wersja programu net8.0-macos)
net9.0-tizen (Kolejna wersja programu net8.0-tizen)
net9.0-tvos (Kolejna wersja programu net8.0-tvos)
net9.0-windows (Kolejna wersja programu net8.0-windows)
net10.0 (Kolejna wersja programu net9.0)
net10.0-android (Kolejna wersja programu net9.0-android)
net10.0-browser (Kolejna wersja programu net9.0-browser)
net10.0-ios (Kolejna wersja programu net9.0-ios)
net10.0-maccatalyst (Kolejna wersja programu net9.0-maccatalyst)
net10.0-macos (Kolejna wersja programu net9.0-macos)
net10.0-tizen (Kolejna wersja programu net9.0-tizen)
net10.0-tvos (Kolejna wersja programu net9.0-tvos)
net10.0-windows (Kolejna wersja programu net9.0-windows)

Aby Twoja aplikacja była przenośna na różnych platformach, ale jednocześnie miała dostęp do specyficznych dla systemu operacyjnego interfejsów API, możesz celować w wiele platform-specyficznych TFM i dodać zabezpieczenia wokół wywołań tych interfejsów, używając dyrektyw preprocesora #if. Aby uzyskać listę dostępnych symboli, zobacz Symbole preprocesora.

Sugerowane cele

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

  • Aplikacje przenośne na wiele platform powinny być skierowane na podstawowy TFM, na przykład net10.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ć skierowane na net10.0-windows.
  • Modele aplikacji dla wielu platform (na przykład ASP.NET Core) powinny przynajmniej celować w podstawowe TFM, na przykład net10.0, ale mogą także być przeznaczone dla dodatkowych odmian specyficznych dla platform, aby umożliwić korzystanie z większej liczby 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 net8.0-ios17.2. 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 odróżnić ją od wersji systemu operacyjnego uruchomieniowego.

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 Android dodała interfejsy API poziomu 34 w aktualizacji zestawu SDK .NET 8.0.x, możesz uzyskać do nich dostęp przy użyciu TFM net8.0-android34.0.

Jeśli TFM specyficzny dla systemu operacyjnego nie określa jawnie wersji platformy, ma domyślną wartość, którą można wywnioskować z podstawowego TFM i nazwy platformy. Na przykład domyślna wersja platformy dla systemu Android na platformie .NET 9 to 35.0, co oznacza, że net9.0-android jest to skrót kanoniczny net9.0-android35.0 TFM. Forma skrócona jest przeznaczona tylko do użycia w plikach projektu i jest przekształcana do formy kanonicznej przez cele MSBuild zestawu SDK .NET przed przekazaniem do innych narzędzi, takich jak NuGet.

W poniższej tabeli przedstawiono domyślną wersję platformy docelowej (TPV) dla systemów Android i iOS dla każdej wersji platformy .NET. Jeśli chcesz użyć najnowszych powiązań, użyj wartości domyślnej (czyli nie określ wersji systemu operacyjnego).

Wersja platformy .NET Android iOS
.NET 8 34,0 17,2
.NET 9 35,0 18,0
.NET 10 36.0 18.7

Począwszy od platformy .NET 9, gdy wersje usługi wprowadzają obsługę późniejszego protokołu TPV (który zawsze będzie miał taki sam numer wersji głównej , jak w przypadku początkowego wydania wersji platformy .NET), najwcześniej obsługiwany protokół TPV dla tej wersji platformy .NET pozostanie obsługiwany. Na przykład w przypadku platformy .NET 9 najwcześniej obsługiwana wersja systemu iOS 18.0 pozostanie obsługiwana, nawet jeśli wersja usługi doda obsługę najnowszej wersji systemu iOS 18.x. Jeśli musisz użyć najwcześniejszych powiązań dla wydania platformy .NET, użyj określonego numeru wersji systemu operacyjnego w programie TFM.

Uwaga

Na platformach Firmy Apple (iOS, macOS, tvOS i Mac Catalyst) na platformie .NET 8 i starszych wersjach domyślny TPV jest najnowszą obsługiwaną wersją w aktualnie zainstalowanym obciążeniu. Oznacza to, że aktualizacja obciążenia systemu iOS na platformie .NET 8 może na przykład spowodować powstanie wyższego domyślnego protokołu TPV, jeśli w tym obciążeniu dodano obsługę nowej wersji systemu iOS. W poprzedniej tabeli domyślną wersją TPV jest wersja początkowa dla podanej wersji .NET.

Począwszy od platformy .NET 9, to specjalne zachowanie dotyczy tylko projektów wykonywalnych . Domyślny protokół TPV dla projektów bibliotek pozostaje teraz taki sam dla całej głównej wersji platformy .NET, podobnie jak wszystkie inne platformy.

Pierwszeństwo

Jeśli aplikacja odwołuje się do pakietu z wieloma zasobami dla różnych TFM, preferowane są zasoby bliższe numerowi wersji. Na przykład, jeśli Twoja aplikacja jest skierowana na net9.0-ios, a pakiet oferuje zasoby dla net9.0 i net8.0-ios, zasoby net9.0 są używane. 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 środowiska uruchomieniowego 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 zapisany do skompilowanego zestawu projektu jako UnsupportedOSPlatformAttribute atrybut 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 wartość SupportedOSPlatformVersion wpływa na procesy pakowania aplikacji i budowania specyficzne dla danej platformy, które są omówione w dokumentacji tych platform.

Poniższy przykład to fragment pliku projektu, który używa właściwości TargetFramework i SupportedOSPlatformVersion MSBuild do określenia, że aplikacja lub biblioteka ma dostęp do interfejsów API systemu iOS 15.0, ale obsługuje działanie w systemie iOS 13.0 i nowszych.

<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 pokazuje, jak ustawić platformę docelową na .NET 10.

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

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

</Project>

Po określeniu wielu platform docelowych można warunkowo odwoływać się do zestawów dla każdej platformy docelowej. W swoim kodzie można warunkowo kompilować przeciwko tym zestawom przy użyciu symboli preprocesora z wykorzystaniem konstrukcji 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 formie liczby 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ć .NET Standard, .NET Core lub .NET 5+ TFM na symbol preprocesora, zastąp kropki i łączniki znakami podkreślenia oraz zmień małe litery na wielkie (na przykład, symbol dla netstandard2.0 to NETSTANDARD2_0).

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 .NET 5+ SDK-ach)
Symbole platformy (dostępne tylko
podczas określania formatu TFM specyficznego dla systemu operacyjnego)
.NET Framework NETFRAMEWORK, NET481, , , NET48NET472NET471NET47NET462NET461NET46NET452NET451NET45NET40NET35NET20 NET48_OR_GREATER, NET472_OR_GREATER, , , NET471_OR_GREATERNET47_OR_GREATERNET462_OR_GREATERNET461_OR_GREATERNET46_OR_GREATERNET452_OR_GREATERNET451_OR_GREATERNET45_OR_GREATERNET40_OR_GREATERNET35_OR_GREATERNET20_OR_GREATER
.NET Standard NETSTANDARD, NETSTANDARD2_1, , , NETSTANDARD2_0NETSTANDARD1_6NETSTANDARD1_5NETSTANDARD1_4NETSTANDARD1_3NETSTANDARD1_2NETSTANDARD1_1NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATER, NETSTANDARD2_0_OR_GREATER, , NETSTANDARD1_6_OR_GREATER, NETSTANDARD1_5_OR_GREATERNETSTANDARD1_4_OR_GREATER, NETSTANDARD1_3_OR_GREATER, , NETSTANDARD1_2_OR_GREATERNETSTANDARD1_1_OR_GREATERNETSTANDARD1_0_OR_GREATER
.NET 5+ (i .NET Core) NET, NET10_0, , , NET9_0NET8_0NET7_0NET6_0NET5_0NETCOREAPPNETCOREAPP3_1NETCOREAPP3_0NETCOREAPP2_2NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1NETCOREAPP1_0 NET10_0_OR_GREATER, NET9_0_OR_GREATER, , , NET8_0_OR_GREATERNET7_0_OR_GREATERNET6_0_OR_GREATERNET5_0_OR_GREATERNETCOREAPP3_1_OR_GREATERNETCOREAPP3_0_OR_GREATERNETCOREAPP2_2_OR_GREATERNETCOREAPP2_1_OR_GREATERNETCOREAPP2_0_OR_GREATERNETCOREAPP1_1_OR_GREATERNETCOREAPP1_0_OR_GREATER ANDROID, BROWSER, , IOS, MACCATALYSTMACOS, , 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 wersji, na którą są kierowane.
  • 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 celem jest .NET Framework 2.0, zdefiniowane są następujące symbole: NET20, NET20_OR_GREATER, NET11_OR_GREATER i 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 znaczników docelowego środowiska (TFM), używanych przez TargetFramework MSBuild i NuGet.

Przestarzałe struktury docelowe

Następujące frameworki docelowe są przestarzałe. Pakiety przeznaczone dla tych platform docelowych należy przenieść do wskazanych zamienników.

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
Windows 8.1 netcore451
Windows 10 uap10.0
winrt netcore45

Zobacz też