當您以應用程式或程式庫中的架構為目標時,您將指定要提供給應用程式或程式庫的一組 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 用戶端所支援的目標框架。 對等項目會顯示在括弧內。 例如,win81 是 netcore451 的對等 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.0、net9.0 和 net10.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.0 和 net8.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框架(net40 和 net45)的 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) -
TargetPlatformMoniker、TargetPlatformIdentifier、 以及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 框架 |
NETFRAMEWORK、NET481、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 標準 |
NETSTANDARD、NETSTANDARD2_1、NETSTANDARD2_0、NETSTANDARD1_6、NETSTANDARD1_5、NETSTANDARD1_4、NETSTANDARD1_3、、NETSTANDARD1_2、、 NETSTANDARD1_1NETSTANDARD1_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_GREATERNETSTANDARD1_0_OR_GREATER |
|
| .NET 5+(以及 .NET 核心) |
NET、NET10_0、NET9_0、NET8_0、NET7_0、NET6_0、NET5_0、NETCOREAPP、NETCOREAPP3_1、NETCOREAPP3_0、NETCOREAPP2_2、NETCOREAPP2_1、NETCOREAPP2_0、NETCOREAPP1_1、NETCOREAPP1_0 |
NET10_0_OR_GREATER、NET9_0_OR_GREATER、NET8_0_OR_GREATER、NET7_0_OR_GREATER、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 |
ANDROID、BROWSER、IOS、MACCATALYST、MACOS、TVOS、、、 WINDOWS[OS][version] (例如 IOS15_1)、[OS][version]_OR_GREATER (例如 IOS15_1_OR_GREATER) |
注意
- 無論您的目標版本為何,系統都會定義無版本符號。
- 系統只會針對您設定為目標的版本定義版本特定符號。
- 系統會針對您的目標版本和所有更早版本定義
<framework>_OR_GREATER符號。 例如,如果你針對 .NET Framework 2.0,則會定義以下符號:NET20、NET20_OR_GREATER、NET11_OR_GREATER和NET10_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 |