Zielframeworks in Projekten im SDK-Format

Wenn Sie ein Framework in einer App oder Bibliothek als Ziel verwenden, geben Sie mehrere APIs an, die Sie für die App oder Bibliothek verfügbar machen möchten. Das Zielframework wird mithilfe von Zielframeworkmonikern (Target Framework Monikers, TFMs) in Ihrer Projektdatei angegeben.

Eine App oder Bibliothek kann eine Version des .NET Standards als Ziel verwenden. .NET Standard-Versionen stellen standardisierte APIs in allen .NET-Implementierungen dar. Eine Bibliothek kann z.B. NET Standard 1.6 als Ziel verwenden und Zugriff auf APIs erhalten, die sowohl in .NET Core und .NET Framework mit der gleichen Codebasis funktionieren.

Eine App oder Bibliothek kann auch eine spezifische .NET-Implementierung als Ziel verwenden, um Zugriff auf implementierungsspezifische APIs zu erhalten. Eine App für Xamarin.iOS (z. B. Xamarin.iOS10) kann beispielsweise auf von Xamarin bereitgestellte API-Wrapper für iOS 10 zugreifen, während eine App, die für die universelle Windows-Plattform (UWP, uap10.0) entwickelt wurde, Zugriff auf APIs hat, die Code für Windows 10-Geräte kompilieren.

Für einige Zielframeworks (z. B. das .NET Framework) werden die APIs von den Assemblys definiert, die das Framework in einem System installiert. Zu diesen APIs können auch Anwendungsframework-APIs zählen (z. B. ASP.NET).

Für paketbasierte Zielframeworks (z. B. .NET 5 oder höher, .NET Core und .NET Standard) werden die APIs von den NuGet-Paketen definiert, die in der App oder der Bibliothek enthalten sind.

Neueste Versionen

In der folgenden Tabelle wird aufgelistet, wie die häufigsten Zielframeworks lauten, wie auf diese verwiesen wird und welche Version von .NET Standard sie implementieren. Diese Zielframeworkversionen sind die neuesten stabilen Versionen. Vorabversionen werden nicht angezeigt. Ein TFM ist ein standardisiertes Tokenformat zum Angeben des Zielframeworks einer .NET-App oder -Bibliothek.

Zielframework Latest
Stabile Version
TFM Implementiert
.NET Standard-Version
.NET 6 6 net6.0
.NET 5 5 net5.0
.NET Standard 2.1 netstandard2.1
.NET Core 3.1 netcoreapp3.1 2.1
.NET Framework 4.8 net48 2,0

Unterstützte Zielframeworks

Auf ein Zielframework wird normalerweise mit einem TFM verwiesen. In der folgenden Tabelle werden die vom .NET SDK und dem NuGet-Client unterstützten Zielframeworks aufgelistet. Äquivalente werden in Klammern angegeben. win81 ist z.B ein äquivalenter TFM von netcore451.

Zielframework TFM
.NET 5 oder höher (und .NET Core) netcoreapp1.0
netcoreapp1.1
netcoreapp2.0
netcoreapp2.1
netcoreapp2.2
netcoreapp3.0
netcoreapp3.1
net5.0*
net6.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
Windows Store netcore [netcore45]
netcore45 [win] [win8]
netcore451 [win81]
.NET Micro Framework netmf
Silverlight sl4
sl5
Windows Phone wp [wp7]
wp7
wp75
wp8
wp81
wpa81
Universelle Windows-Plattform uap [uap10.0]
uap10.0 [win10] [netcore50]

* .NET 5- und höhere TFMs enthalten einige betriebssystemspezifische Variationen. Weitere Informationen finden Sie im folgenden Abschnitt Betriebssystemspezifische TFMs in .NET 5 oder höher.

Betriebssystemspezifische TFMs in .NET 5 oder höher

Die net5.0- und net6.0-TFMs und enthalten Technologien, die auf verschiedenen Plattformen funktionieren. Das Angeben eines betriebssystemspezifischen TFM führt dazu, dass APIs für ein Betriebssystem spezifisch sind, das für Ihre App verfügbar ist, z. B. Windows Forms oder iOS-Bindungen. Betriebssystemspezifische TFMs erben auch jede API, die für Ihren Basis-TFM verfügbar ist, z. B. den net5.0-TFM.

Mit .NET 5 wurde der betriebssystemspezifische net5.0-windows-TFM eingeführt, der Windows-spezifische Bindungen für WinForms-, WPF- und UWP-APIs umfasst. Mit .NET 6 werden weitere betriebssystemspezifische TFMs eingeführt.

Die folgende Tabelle zeigt die Kompatibilität der .NET 5-TFMs (oder höher).

TFM Kompatibel mit
net5.0 net1..4 (mit NU1701-Warnung)
netcoreapp1..3.1 (Warnung bei Verweis auf WinForms oder WPF)
netstandard1..2.1
net5.0-windows netcoreapp1..3.1 (plus alles Ererbte von net5.0)
net6.0 (Nachfolgeversion von net5.0)
net6.0-android xamarin.android (und alles andere von net6.0 geerbte)
net6.0-ios xamarin.ios (und alles andere von net6.0 geerbte)
net6.0-macos xamarin.mac (und alles andere von net6.0 geerbte)
net6.0-maccatalyst xamarin.ios (und alles andere von net6.0 geerbte)
net6.0-tvos xamarin.tvos (und alles andere von net6.0 geerbte)
net6.0-windows (Nachfolgeversion von net5.0-windows)

Damit Ihre App auf verschiedenen Plattformen genutzt werden kann, Zugriff auf betriebssystemspezifische APIs aber trotzdem möglich ist, können Sie als Ziel mehrere betriebssystemspezifische TFMs verwenden und Plattformwächter für betriebssystemspezifische API-Aufrufe hinzufügen, indem Sie #if-Präprozessoranweisungen nutzen.

Vorgeschlagene Ziele

Verwenden Sie diese Richtlinien, um zu bestimmen, welchen TFM Sie für Ihre App verwenden:

  • Apps, die für mehrere Plattformen genutzt werden können, sollten einen Basis-TFM (z. B. net5.0) als Ziel verwenden. Dazu gehören die meisten Bibliotheken, jedoch auch ASP.NET Core und Entity Framework.

  • Plattformspezifische Bibliotheken sollten plattformspezifische Varianten als Ziel verwenden. WinForms- und WPF-Projekte sollten beispielsweise net5.0-windows oder net6.0-windows als Ziel verwenden.

  • Plattformübergreifende Anwendungsmodelle (Xamarin Forms, ASP.NET Core) und Überbrückungspakete (Xamarin.Essentials) sollten mindestens den Basis-TFM (z. B. net6.0) als Ziel verwenden. Sie können aber auch zusätzliche plattformspezifische Varianten verwenden, um für weitere APIs oder Features nutzbar zu sein.

Betriebssystemversion in TFMs

Sie können am Ende eines betriebssystemspezifischen TFM auch eine optionale Betriebssystemversion angeben, z. B. net6.0-ios15.0. Die Version gibt an, welche APIs für Ihre App oder Bibliothek verfügbar sind. Sie steuert nicht die Betriebssystemversion, die Ihre App oder Bibliothek zur Laufzeit unterstützt. Sie wird verwendet, um die Verweisassemblys auszuwählen, mit denen Ihr Projekt kompiliert wird, und um Ressourcen aus NuGet-Paketen auszuwählen. Stellen Sie sich diese Version als „Plattformversion“ oder „Betriebssystem-API-Version“ vor, um sie von der Betriebssystemversion zur Laufzeit zu unterscheiden.

Wenn ein betriebssystemspezifischer TFM die Plattformversion nicht explizit angibt, verfügt er über einen impliziten Wert, der aus dem Basis-TFM und dem Plattformnamen abgeleitet werden kann. Ein Beispiel: Der Standardplattformwert für iOS in .NET 6 lautet 15.0. Das bedeutet, dass net6.0-ios eine Kurzform für den kanonischen TFM net6.0-ios15.0 ist. Die implizite Plattformversion für einen neueren Basis-TFM kann höher sein, z. B. könnte ein zukünftiger net7.0-ios-TFM net7.0-ios16.0 entsprechen. Die Kurzform ist nur für die Verwendung in Projektdateien vorgesehen und wird durch die MSBuild Ziele des .NET SDK vor der Übergabe an andere Tools wie NuGet auf die kanonische Form erweitert.

Das .NET SDK ist so konzipiert, dass es neu veröffentlichte APIs für eine einzelne Plattform ohne eine neue Version des Basis-TFM unterstützen kann. Dadurch können Sie auf plattformspezifische Funktionen zugreifen, ohne auf eine Hauptversion von .NET warten zu müssen. Sie können auf diese neu veröffentlichten APIs zugreifen, indem Sie die Plattformversion im TFM erhöhen. Ein Beispiel: Wenn die iOS-Plattform iOS 15.1-APIs in einem .NET 6.0.x SDK-Update hinzugefügt hat, können Sie mit dem TFM net6.0-ios15.1 darauf zugreifen.

Unterstützung älterer Betriebssystemversionen

Eine plattformspezifische App oder Bibliothek für APIs wird zwar aus einer bestimmten Version dieses Betriebssystems kompiliert, aber Sie können sie mit früheren Betriebssystemversionen kompatibel machen, indem Sie Ihrer Projektdatei die Eigenschaft SupportedOSPlatformVersion hinzufügen. Die Eigenschaft SupportedOSPlatformVersion gibt die Betriebssystemversion an, die zum Ausführen Ihrer App oder Bibliothek mindestens erforderlich ist. Wenn Sie diese Betriebssystem-Mindestversion, die zur Laufzeit verwendet werden soll, im Projekt nicht explizit angeben, wird standardmäßig die Plattformversion aus dem TFM verwendet.

Damit Ihre App unter einer älteren Betriebssystemversion ordnungsgemäß ausgeführt werden kann, kann sie keine APIs aufrufen, die in dieser Version des Betriebssystems nicht vorhanden sind. Sie können jedoch Wächter für Aufrufe neuerer APIs hinzufügen, sodass die APIs nur aufgerufen werden, wenn sie in einer Version des Betriebssystems ausgeführt werden, die sie unterstützt. Mit diesem Muster können Sie Ihre App oder Bibliothek so entwerfen, dass sie die Ausführung unter älteren Betriebssystemversionen unterstützt und gleichzeitig neuere Betriebssystemfunktionen nutzt, wenn sie unter neueren Betriebssystemversionen ausgeführt wird.

Der SupportedOSPlatformVersion -Wert (ob explizit oder standard) wird vom SupportedOSPlatformVersion verwendet, der nicht überwachte Aufrufe neuerer APIs erkennt und warnt. Sie wird als UnsupportedOSPlatformAttribute-Assemblyattribut in die kompilierte Assembly des Projekts eingebaut, sodass das Analysetool für die Plattformkompatibilität unbeaufsichtigte Aufrufe der APIs dieser Assembly aus Projekten mit einem niedrigeren SupportedOSPlatformVersion-Wert erkennen kann. Auf einigen Plattformen wirkt sich der SupportedOSPlatformVersion-Wert auf plattformspezifische Prozesse für die App-Paketerstellung und -Kompilierung aus, die in der Dokumentation für diese Plattformen behandelt werden.

Hier sehen Sie einen Beispielauszug einer Projektdatei, die die MSBuild-Eigenschaften TargetFramework und SupportedOSPlatformVersion verwendet, um anzugeben, dass die App oder Bibliothek Zugriff auf iOS 15.0-APIs hat, aber die Ausführung unter iOS 13.0 und höher unterstützt:

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

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

  ...

</Project>

Angeben eines Zielframeworks

Zielframeworks werden in einer Projektdatei angegeben. Wenn ein einzelnes Zielframework angegeben wird, verwenden Sie das Element „TargetFramework“. Die folgende Projektdatei einer Konsolen-App veranschaulicht, wie Sie .NET 5 als Zielframework festlegen:

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

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

</Project>

Wenn Sie mehrere Zielframeworks angeben, können Sie bedingt auf Assemblys für jedes Zielframework verweisen. Sie können in Ihrem Code bedingt mit diesen Assemblys kompilieren, indem Sie die Präprozessorsymbole mit wenn-dann-sonst-Logik verwenden.

Die folgende Bibliotheksprojektdatei ist auf APIs von .NET Standard (netstandard1.4) und des .NET Framework (net40 und net45) ausgerichtet. Verwenden Sie das Element „TargetFrameworks“ im Plural für mehrere Zielframeworks. Die Condition-Attribute enthalten implementierungsspezifische Pakete, wenn die Bibliothek für die zwei .NET Framework-TFMs kompiliert wird:

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

In Ihrer Bibliothek oder App schreiben Sie mithilfe von Präprozessoranweisungen Bedingungscode, um für die verschiedenen Zielframeworks zu kompilieren:

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

Das Buildsystem beachtet Präprozessorsymbole, die Zielframeworks darstellen, die in der Tabelle Unterstützte Zielframeworkversionen aufgelistet sind, wenn Sie Projekte im SDK-Format verwenden. Wenn Sie ein Symbol verwenden, das eine .NET Standard, .NET Core oder .NET 5+ TFM darstellt, ersetzen Sie Punkte und Bindestriche durch einen Unterstrich, und ändern Sie Kleinbuchstaben in Großbuchstaben (z. B. ist NETSTANDARD1_4das Symbol für netstandard1.4 ). Sie können die Generierung dieser Symbole über die DisableImplicitFrameworkDefines -Eigenschaft deaktivieren. Weitere Informationen zu dieser Eigenschaft finden Sie unter DisableImplicitFrameworkDefine.

Hier finden Sie eine vollständige Liste der Präprozessorsymbole für .NET-Zielframeworks:

Zielframeworks Symbole Zusätzliche Symbole, die in .NET SDK 5 oder höher verfügbar sind
.NET Framework NETFRAMEWORK, NET48, NET472, NET471, NET47, NET462, NET461, 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 oder höher (und .NET Core) NET, NET6_0, NET5_0, NETCOREAPP, NETCOREAPP3_1, NETCOREAPP3_0, NETCOREAPP2_2, NETCOREAPP2_1, NETCOREAPP2_0, NETCOREAPP1_1, NETCOREAPP1_0 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

Hinweis

  • Versionslose Symbole werden unabhängig von der Version definiert, die Sie als Ziel verwenden.
  • Versionsspezifische Symbole werden nur für die Version definiert, die Sie als Ziel verwenden.
  • Die <framework>_OR_GREATER-Symbole werden für die Zielversion und alle früheren Versionen definiert. Wenn Sie beispielsweise .NET Framework 2.0 als Ziel festgelegt haben, werden die folgenden Symbole definiert: NET_2_0, NET_2_0_OR_GREATER, NET_1_1_OR_GREATER und NET_1_0_OR_GREATER.
  • Diese unterscheiden sich von den Zielframeworkmonikern (TARGET Framework Moniker, TFMs), die von der MSBuild-Eigenschaft und NuGet verwendet werden.

Veraltete Zielframeworks

Die folgenden Zielframeworks sind veraltet. Pakete, die auf diese Zielframeworks ausgelegt sind, sollten in das jeweilige Nachfolgeframework migriert werden.

Veralteter TFM Ersetzung
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

Weitere Informationen