SDK 樣式專案中的目標架構

當您以應用程式或程式庫中的架構為目標時,您將指定要提供給應用程式或程式庫的一組 API。 您可以在專案檔中使用目標 Framework Moniker (TFM) 來指定目標 Framework。

應用程式或函式庫可以鎖定 .NET Standard 的版本。 .NET 標準版本代表所有 .NET 實作中標準化的 API 集合。 例如,函式庫可以針對 .NET Standard 1.6,並取得跨 .NET 核心與 .NET 框架共用同一程式碼庫的 API。

應用程式或函式庫也可以針對特定 .NET 實作,取得針對實作的特定 API 存取權。 例如,針對通用 Windows 平台(UWP,uap10.0)的應用程式可以使用為執行Windows 10裝置編譯的 API。

對於某些目標框架,例如 .NET Framework,API 是由該框架安裝在系統上的組件所定義,並可能包含應用程式框架 API(例如 ASP.NET)。

對於基於套件的目標框架(例如 .NET 5+、.NET Core 及 .NET Standard),API 由應用程式或函式庫中附贈的 NuGet 套件定義。

最新版本

下表定義了最常見的目標框架、它們的引用方式,以及它們實作的 .NET Standard 版本。 這些目標 Framework 版本是最新穩定版本。 不顯示發行前版本。 target 框架名稱(TFM)是一種標準化的代幣格式,用來指定.NET應用程式或函式庫的目標框架。

目標框架 最新
穩定版本
目標框架名稱 (TFM) 已實作
.NET 標準版
.NET 10 10 net10.0 2.1
.NET 9 9 net9.0 2.1
.NET 8 8 net8.0 2.1
.NET 標準 2.1 netstandard2.1 N/A
.NET 核心 3.1 netcoreapp3.1 2.1
.NET 框架 4.8.1 net481 2.0

支援的目標框架

目標框架通常會被標識為 TFM。 下表顯示 .NET SDK 與 NuGet 用戶端所支援的目標框架。 對等項目會顯示在括弧內。 例如,win81netcore451 的對等 TFM。

目標框架 TFM
.NET 5+(以及 .NET 核心) netcoreapp1.0
netcoreapp1.1
netcoreapp2.0
netcoreapp2.1
netcoreapp2.2
netcoreapp3.0
netcoreapp3.1
net5.0*
net6.0*
net7.0*
net8.0*
net9.0*
淨10.0*
.NET 標準 netstandard1.0
netstandard1.1
netstandard1.2
netstandard1.3
netstandard1.4
netstandard1.5
netstandard1.6
netstandard2.0
netstandard2.1
.NET 框架 net11
net20
net35
net40
net403
net45
net451
net452
net46
net461
net462
net47
net471
net472
net48
net481
Windows商店 網路核心 [netcore45]
netcore45 [贏] [win8]
.NET Core 451 [win81]
.NET nanoFramework netnano1.0
.NET 微框架 netmf
Silverlight sl4
sl5
Windows Phone WP [WP7]
wp7
wp75
wp8
wp81
wpa81
通用 Windows 平台 UAP [UAP10.0]
uap10.0 [win10] [NET Core 50]

* .NET 5 及以後版本的 TFM 包含一些作業系統特定的變體。 如需詳細資訊,請參閱下列一節, 作業系統特定的 TFM

作業系統特定的目標框架標識 (TFM)

net8.0net9.0net10.0 TFM 包括跨不同平台運作的技術。 指定一個OS專屬的TFM,使得特定作業系統的API可供你的應用程式使用,例如Windows Forms或iOS綁定。 OS 特定的 TFM 會繼承其基底 TFM 所提供的每個 API,例如net10.0 TFM。

下表顯示 .NET 8+ TFM 的相容性。

TFM 與下列版本相容
net8.0 (net7.0 的後續版本)
net8.0-android (net7.0-android 的後續版本)
net8.0-browser 繼承自 net8.0 的所有項目
net8.0-ios (net7.0-ios 的後續版本)
net8.0-maccatalyst (net7.0-maccatalyst 的後續版本)
net8.0-macos (net7.0-macos 的後續版本)
net8.0-tizen (net7.0-tizen 的後續版本)
net8.0-tvos (net7.0-tvos 的後續版本)
net8.0-windows (net7.0-windows 的後續版本)
net9.0 (net8.0 的後續版本)
net9.0-android (net8.0-android 的後續版本)
net9.0-browser (net8.0-browser 的後續版本)
net9.0-ios (net8.0-ios 的後續版本)
net9.0-maccatalyst (net8.0-maccatalyst 的後續版本)
net9.0-macos (net8.0-macos 的後續版本)
net9.0-tizen (net8.0-tizen 的後續版本)
net9.0-tvos (net8.0-tvos 的後續版本)
net9.0-windows (net8.0-windows 的後續版本)
net10.0 (net9.0 的後續版本)
net10.0-android (net9.0-android 的後續版本)
net10.0-browser (net9.0-browser 的後續版本)
net10.0-ios (net9.0-ios 的後續版本)
net10.0-maccatalyst (net9.0-maccatalyst 的後續版本)
net10.0-macos (net9.0-macos 的後續版本)
net10.0-tizen (net9.0-tizen 的後續版本)
net10.0-tvos (net9.0-tvos 的後續版本)
net10.0-windows (net9.0-windows 的後續版本)

若要讓您的應用程式可移植到不同的平台,但仍可存取 OS 特定的 API,您可以使用 #if 前置處理器指示詞,以多個 OS 特定的 TFM 為目標,並新增平台防護。 如需可用符號的清單,請參閱前置處理器符號

建議的目標

使用這些指南來判定應用程式中要使用的 TFM:

  • 可移植到多個平台的應用程式應以基底 TFM 為目標,例如 net10.0。 這包括大多數函式庫,也包括 ASP.NET Core 和 Entity Framework。
  • 平台特定程式庫應以平台特定類別為目標。 例如,WinForms 和 WPF 專案應該針對 net10.0-windows
  • 跨平台應用模型(例如 ASP.NET Core)至少應該針對基礎 TFM,例如 net10.0,但也可能針對更多平台特定類型,以啟用更多 API 或功能。

TFM 中的 OS 版本

您也可以在 OS 特定 TFM 結尾指定選擇性 OS 版本,例如 net8.0-ios17.2。 版本會指出您的應用程式或程式庫可以使用哪些 API。 它不控制你的應用程式或函式庫在執行時支援的作業系統版本。 其用來選取專案所編譯的參考元件,以及從 NuGet 套件中選取資產。 可以把這個版本當作「平台版本」或「作業系統 API 版本」來區分執行時作業系統版本。

.NET SDK 設計上能支援個別平台的新釋出 API,無需更新基礎 TFM 版本。 這讓你能在不等待 .NET 主要版本的情況下,存取平台專屬功能。 您可以藉由遞增 TFM 中的平台版本來取得這些新發行 API 的存取權。 例如,如果 Android 平台在 .NET 8.0.x SDK 更新中新增了 API 層級 34 API,你可以透過 TFM net8.0-android34.0 來存取它們。

當 OS 特定的 TFM 未明確指定平台版本時,其具有可從基底 TFM 和平台名稱推斷的隱含值。 例如,.NET 9 中 Android 的預設平台版本是 35.0,這表示 net9.0-android 是標準 net9.0-android35.0 TFM 的簡稱。 簡寫形式僅用於專案檔案,並由 .NET SDK 的 MSBuild 目標擴展為標準形式,然後再傳遞給其他工具,如 NuGet。

下表顯示每個.NET版本的 Android 與 iOS default 目標平台版本(TPV)。 如果您想要使用最新的系結,請使用預設值(也就是不要指定 OS 版本)。

.NET 版本 Android iOS
.NET 8 34.0 17.2
.NET 9 35.0 18.0
.NET 10 36.0 18.7

從 .NET 9 開始,當服務版本引入對新版本 TPV 的支援(此 TPV 的 major 版本號將永遠與 .NET 最初釋出時相同),該 .NET 版本最早支援的 TPV 將繼續受到支援。 例如,對於 .NET 9,最早支援的 iOS 版本 18.0 仍會持續支援,即使服務版本新增了對最新 iOS 18.x 的支援。 如果您需要使用最早期版本的綁定來對應 .NET 發行版本,請在您的 TFM 中使用特定的作業系統版本號碼。

注意

在 Apple 平台(iOS、macOS、tvOS 及 Mac Catalyst)的 .NET 8 及更早版本中,預設的 TPV 是目前安裝工作負載中支援的最新版本。 這表示,例如在 .NET 8 更新 iOS 工作負載時,如果該工作負載新增了對新版本 iOS 的支援,預設 TPV 可能會提高。 在前表中,預設的 TPV 是該 .NET 版本的初始版本。

從 .NET 9 開始,此特殊行為僅適用於 可執行專案。 圖書館專案的預設 TPV 現在在整個主要 .NET 版本中保持不變,與其他平台相同。

優先順序

如果您的應用程式參考的套件包含多個針對不同目標框架(TFM)的資產,通常會優先選擇版本號碼較接近的資產。 例如,如果您的應用程式目標為 net9.0-ios,而套件會提供 net9.0net8.0-ios 的資產,則會使用 net9.0 資產。 如需詳細資訊,請參閱 優先權

支援舊版作業系統

雖然平台特定應用程式或程式庫是針對該 OS 特定版本的 API 進行編譯,但您可以將 SupportedOSPlatformVersion 屬性新增至專案檔,使其與舊版 OS 相容。 SupportedOSPlatformVersion 屬性指出執行應用程式或程式庫所需的最低 OS 版本。 如果你在專案中沒有明確指定這個最低執行時作業系統版本,它就會預設為 TFM 中的平台版本。

若要讓應用程式在舊版作業系統上正確執行,則其無法呼叫不存在於該作業系統版本的 API。 不過,您可以新增對較新 API 呼叫的防護,使其只在支援的作業系統版本上執行時呼叫。 此模式可讓您設計應用程式或程式庫,以支援在舊版作業系統上執行,同時利用較新的作業系統功能在較新的作業系統版本上執行。

SupportedOSPlatformVersion會使用 值 (無論明確或預設),這會偵測並警告對較新 API 的未受防護呼叫。 其會以 UnsupportedOSPlatformAttribute 組件屬性的形式永久融入專案已編譯的組件,以便平台相容性分析器能夠偵測來自具有較低 SupportedOSPlatformVersion 值的專案對該組件 API 的未受保護呼叫。 在某些平台上,SupportedOSPlatformVersion 值會影響平台特定的應用程式封裝和建置程序,這些程序涵蓋在這些平台的文件中。

下列範例是專案檔的摘錄,該專案檔會使用 和 TargetFrameworkSupportedOSPlatformVersion MSBuild 屬性來指定應用程式或程式庫可以存取 iOS 15.0 API,但支援在 iOS 13.0 和更新版本上執行:

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

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

</Project>

如何指定目標框架

目標框架會在專案檔中指定。 指定單一目標 Framework 時,請使用 TargetFramework 項目。 以下主控台應用程式專案檔案說明如何設定目標為 .NET 10:

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

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

</Project>

當您指定多個目標架構時,您可以有條件地參考每個目標架構的元件。 在您的程式碼中,您可以使用前置處理器符號搭配 if-then-else 邏輯,有條件地對這些組件進行編譯。

以下函式庫專案針對.NET標準(netstandard1.4)及.NET框架(net40net45)的 API。 使用含有多個目標 Framework 的複數 TargetFrameworks 元素。 Condition屬性包含在編譯函式庫時針對兩個.NET Framework TFM的實作專屬套件:

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

在程式庫或應用程式中,您可以使用前置處理器指示詞撰寫具條件的程式碼,為每個目標框架進行編譯:

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

TargetFramework 的值是別名

TargetFramework屬性值(例如net10.0)是一個友善的名稱——一個別名——.NET SDK 將其轉換成標準名稱屬性。 具體來說,SDK 會根據該 TargetFramework 值設定以下屬性:

  • TargetFrameworkMoniker(例如,.NETCoreApp,Version=v10.0
  • TargetFrameworkIdentifier(例如,.NETCoreApp
  • TargetFrameworkVersion(例如,v10.0
  • TargetPlatformMonikerTargetPlatformIdentifier、 以及 TargetPlatformVersion (針對特定平台時)

NuGet 和 .NET SDK 使用這些名稱屬性——而非 TargetFramework 字串——用於套件相容性檢查和建置邏輯。 這種轉換已經在作業系統專用的 TFM 上發生了。 例如,net10.0-windows 可翻譯為 TargetFrameworkMoniker = .NETCoreApp,Version=v10.0 以及 TargetPlatformMoniker = Windows,Version=7.0

由於別名只是一個名稱,只要對應的名稱屬性設定正確,值 TargetFramework 可以是任何字母數字字串。 以下專案檔案使用名為 banana 的自訂別名,並明確設定名稱屬性,使專案能為 .NET 10.0 建置與還原:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>banana</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(TargetFramework)' == 'banana' ">
    <TargetFrameworkIdentifier>.NETCoreApp</TargetFrameworkIdentifier>
    <TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
    <TargetFrameworkMoniker>.NETCoreApp,Version=v10.0</TargetFrameworkMoniker>
  </PropertyGroup>
</Project>

欲了解更多相關屬性,請參閱 TargetFramework MSBuild 屬性參考。

前置處理器符號

當您使用 SDK 樣式專案時,組建系統知道代表目標 Framework 的前置處理器符號,如支援的目標 Framework 版本表格中所示。 若要將.NET標準、.NET核心或.NET 5+ TFM 轉換為預處理器符號,請將點與連字號替換為底線,並將小寫字母改為大寫(例如,netstandard2.0 的符號為 NETSTANDARD2_0)。

您可以透過 DisableImplicitFrameworkDefines 屬性停用這些符號的產生。 如需此屬性的詳細資訊,請參閱 DisableImplicitFrameworkDefines

.NET 目標框架的完整預處理器符號列表如下:

目標框架 符號 其他符號
(以 .NET 5+ SDK 提供)
平台符號(僅可用於特定情境)
當您指定作業系統特定的 TFM 時
.NET 框架 NETFRAMEWORKNET481NET48NET472NET471NET47NET462NET461NET46NET452NET451NET45NET40NET35NET20 NET48_OR_GREATERNET472_OR_GREATERNET471_OR_GREATERNET47_OR_GREATERNET462_OR_GREATERNET461_OR_GREATERNET46_OR_GREATERNET452_OR_GREATERNET451_OR_GREATERNET45_OR_GREATERNET40_OR_GREATERNET35_OR_GREATERNET20_OR_GREATER
.NET 標準 NETSTANDARDNETSTANDARD2_1NETSTANDARD2_0NETSTANDARD1_6NETSTANDARD1_5NETSTANDARD1_4NETSTANDARD1_3、、NETSTANDARD1_2、、 NETSTANDARD1_1NETSTANDARD1_0 NETSTANDARD2_1_OR_GREATERNETSTANDARD2_0_OR_GREATERNETSTANDARD1_6_OR_GREATERNETSTANDARD1_5_OR_GREATERNETSTANDARD1_4_OR_GREATERNETSTANDARD1_3_OR_GREATERNETSTANDARD1_2_OR_GREATERNETSTANDARD1_1_OR_GREATERNETSTANDARD1_0_OR_GREATER
.NET 5+(以及 .NET 核心) NETNET10_0NET9_0NET8_0NET7_0NET6_0NET5_0NETCOREAPPNETCOREAPP3_1NETCOREAPP3_0NETCOREAPP2_2NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1NETCOREAPP1_0 NET10_0_OR_GREATERNET9_0_OR_GREATERNET8_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 ANDROIDBROWSERIOSMACCATALYSTMACOSTVOS、、、 WINDOWS
[OS][version] (例如 IOS15_1)、
[OS][version]_OR_GREATER (例如 IOS15_1_OR_GREATER)

注意

  • 無論您的目標版本為何,系統都會定義無版本符號。
  • 系統只會針對您設定為目標的版本定義版本特定符號。
  • 系統會針對您的目標版本和所有更早版本定義 <framework>_OR_GREATER 符號。 例如,如果你針對 .NET Framework 2.0,則會定義以下符號:NET20NET20_OR_GREATERNET11_OR_GREATERNET10_OR_GREATER
  • NETSTANDARD<x>_<y>_OR_GREATER 符號僅針對 .NET Standard 目標定義,不包括實作 .NET Standard(如 .NET Core 和 .NET Framework)的目標。
  • 這些與 MSBuild TargetFramework 屬性NuGet 使用的目標框架標記不同。

已過時的目標框架

下列目標框架已廢止。 以這些目標框架為對象的套件應該移轉至所指出的替代項目。

已被取代的 TFM 取代
aspnet50
aspnetcore50
dnxcore50
dnx
dnx45
dnx451
dnx452
netcoreapp
dotnet
dotnet50
dotnet51
dotnet52
dotnet53
dotnet54
dotnet55
dotnet56
netstandard
netcore50 uap10.0
贏得 netcore45
Windows 8 netcore45
Windows 8.1 netcore451
Windows 10 uap10.0
winrt netcore45

另請參閱