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 | Najnowszy stabilna wersja |
Nazwa platformy docelowej (TFM) | Zaimplementowana Wersja platformy .NET Standard |
---|---|---|---|
.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
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
, , net8.0
net7.0
i net.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 net9.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 |
Wszystko dziedziczone z net6.0 |
net6.0-maccatalyst |
Wszystko dziedziczone z net6.0 |
net6.0-macos |
Wszystko dziedziczone z net6.0 |
net6.0-tvos |
Wszystko 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 ) |
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 ) |
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
net9.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 .
net9.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
net9.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 Android na platformie .NET 6 to 31.0
, co oznacza, że net6.0-android
jest to skrót kanoniczny net6.0-android31.0
TFM. Dorozumiana wersja platformy dla nowszego podstawowego serwera TFM może być wyższa, na przykład przyszłego net8.0-android
serwera TFM może być mapowane na net8.0-android34.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 | Android | iOS | Katalizator mac | 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 |
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ślnyM protokołem TPV jest wersja początkowa dla podanej wersji platformy .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.
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 systemu Android dodała interfejsy API poziomu 32 interfejsów API w aktualizacji zestawu SDK platformy .NET 6.0.x, możesz uzyskać do nich dostęp przy użyciu programu TFM net6.0-android32.0
.
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 9:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.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 , NET481 , , , NET471 NET47 NET45 NET40 NET472 NET461 NET35 NET462 NET46 NET452 NET451 NET48 NET20 |
NET48_OR_GREATER , NET472_OR_GREATER , , , NET462_OR_GREATER NET452_OR_GREATER NET47_OR_GREATER NET46_OR_GREATER NET35_OR_GREATER NET461_OR_GREATER NET451_OR_GREATER NET45_OR_GREATER NET40_OR_GREATER NET471_OR_GREATER NET20_OR_GREATER |
|
.NET Standard | NETSTANDARD , NETSTANDARD2_1 , , , NETSTANDARD1_5 NETSTANDARD1_1 NETSTANDARD1_6 NETSTANDARD1_4 NETSTANDARD1_3 NETSTANDARD1_2 NETSTANDARD2_0 NETSTANDARD1_0 |
NETSTANDARD2_1_OR_GREATER , NETSTANDARD2_0_OR_GREATER , , NETSTANDARD1_6_OR_GREATER , NETSTANDARD1_4_OR_GREATER NETSTANDARD1_5_OR_GREATER , NETSTANDARD1_3_OR_GREATER , , NETSTANDARD1_1_OR_GREATER NETSTANDARD1_2_OR_GREATER NETSTANDARD1_0_OR_GREATER |
|
.NET 5+ (i .NET Core) | NET , NET9_0 , , , NET6_0 NET5_0 NETCOREAPP2_0 NET7_0 NETCOREAPP3_1 NETCOREAPP1_1 NETCOREAPP NETCOREAPP3_0 NETCOREAPP2_2 NETCOREAPP2_1 NET8_0 NETCOREAPP1_0 |
NET8_0_OR_GREATER , NET7_0_OR_GREATER , , , NETCOREAPP3_1_OR_GREATER NETCOREAPP2_1_OR_GREATER NETCOREAPP1_1_OR_GREATER NET5_0_OR_GREATER NETCOREAPP3_0_OR_GREATER NETCOREAPP2_2_OR_GREATER NETCOREAPP2_0_OR_GREATER NET6_0_OR_GREATER NETCOREAPP1_0_OR_GREATER |
ANDROID , BROWSER , , IOS , MACOS MACCATALYST , , 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_GREATER
NET11_OR_GREATER
iNET10_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ż
- Nazwy platform docelowych na platformie .NET 5
- Wywoływanie interfejsów API środowisko wykonawcze systemu Windows w aplikacjach klasycznych
- Tworzenie bibliotek za pomocą narzędzi międzyplatformowych
- .NET Standard
- Przechowywanie wersji platformy .NET Core
- Repozytorium GitHub narzędzi NuGet Tools
- Profile struktury na platformie .NET
- Analizator zgodności platformy