SDK 樣式專案中的目標 Framework
當您以應用程式或程式庫中的架構為目標時,您將指定要提供給應用程式或程式庫的一組 API。 您可以在專案檔中使用目標 Framework Moniker (TFM) 來指定目標 Framework。
應用程式或程式庫可以將目標設為某個版本的 .NET Standard。 .NET Standard 版本代表跨所有 .NET 實作的標準化 API 集合。 例如,程式庫可以將目標設為 .NET Standard 1.6,以存取跨 .NET Core 和 .NET Framework (兩者使用相同的程式碼基底) 運作的 API。
應用程式或程式庫也可以將目標設為特定 .NET 實作,以存取實作特定的 API。 例如,以 Xamarin.iOS (例如 Xamarin.iOS10
) 為目標的應用程式可以存取 iOS 10 之 Xamarin 提供的 iOS 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 版本是最新穩定版本。 不顯示發行前版本。 目標架構 Moniker (TFM) 是一種標準化的權杖格式,用於指定 .NET 應用程式或程式庫的目標架構。
目標架構 | 最新 穩定版本 |
目標 Framework Moniker (TFM) | 已實作 .NET Standard 版本 |
---|---|---|---|
.NET 7 | 7 | net7.0 | 2.1 |
.NET 6 | 6 | net6.0 | 2.1 |
.NET 5 | 5 | net5.0 | 2.1 |
.NET Standard | 2.1 | netstandard2.1 | N/A |
.NET Core | 3.1 | netcoreapp3.1 | 2.1 |
.NET Framework | 4.8 | net48 | 2.0 |
支援的目標 Framework
目標 Framework 通常會由 TFM 參考。 下表顯示 .NET SDK 和 NuGet 用戶端所支援的目標架構。 對等項目會顯示在括弧內。 例如,win81
是 netcore451
的對等 TFM。
目標 Framework | TFM |
---|---|
.NET 5+ (和 .NET Core) | netcoreapp1.0 netcoreapp1.1 netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1 net5.0* net6.0* net7.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 市集 | netcore [netcore45] netcore45 [win] [win8] netcore451 [win81] |
.NET Micro Framework | netmf |
Silverlight | sl4 sl5 |
Windows Phone | wp [wp7] wp7 wp75 wp8 wp81 wpa81 |
通用 Windows 平台 | uap [uap10.0] uap10.0 [win10] [netcore50] |
* .NET 5 和更新版本的TFM 包含一些作業系統特定的變化。 如需詳細資訊,請參閱下一節 .NET 5+ OS 特定的TFM。
.NET 5+ OS 專屬的TFM
net5.0
、net6.0
和 net7.0
TFM 包含跨不同平台運作的技術。 指定 OS 特定 TFM 可讓應用程式使用作業系統專用的 API,例如 Windows Forms 或 iOS繫結。 OS 特定 TFM 也會繼承其基底 TFM 可用的每個 API,例如 net6.0
TFM。
.NET 5 引進 net5.0-windows
了 OS 特定的 TFM,其中包含 WinForms、WPF 和 UWP API 的 Windows 特定系結。 .NET 6 和更新版本有額外的 OS 特定TFM,例如 。 net6.0-ios
下表顯示 .NET 5+TFM 的相容性。
TFM | 與下列版本相容 |
---|---|
net5.0 | net1..4 (含 NU1701 警告) netcoreapp1..3.1 (參考 WinForms 或 WPF 時發出警告) netstandard1..2.1 |
net5.0-windows | netcoreapp1..3.1 (加上繼承自 net5.0 的所有項目) |
net6.0 | (後續版本的 net5.0 ) |
net6.0-android | xamarin.android (加上繼承自 net6.0 的所有項目) |
net6.0-ios | xamarin.ios (加上繼承自 net6.0 的所有項目) |
net6.0-maccatalyst | xamarin.ios (加上繼承自 net6.0 的所有項目) |
net6.0-macos | xamarin.mac (加上繼承自 net6.0 的所有項目) |
net6.0-tvos | xamarin.tvos (加上繼承自 net6.0 的所有項目) |
net6.0-windows | (後續版本的 net5.0-windows ) |
net7.0 | (後續版本的 net6.0 ) |
net7.0-android | (後續版本的 net6.0-android ) |
net7.0-ios | (後續版本的 net6.0-ios ) |
net7.0-maccatalyst | (後續版本的 net6.0-maccatalyst ) |
net7.0-macos | (後續版本的 net6.0-macos ) |
net7.0-tvos | (後續版本的 net6.0-tvos ) |
net7.0-windows | (後續版本的 net6.0-windows ) |
若要讓您的應用程式可移植到不同的平台,但仍可存取 OS 特定的 API,您可以使用 #if
前置處理器指示詞,以多個 OS 特定的 TFM 為目標,並新增平台防護。 如需可用符號的清單,請參閱前置處理器符號。
建議的目標
使用這些指導方針來判斷應用程式中要使用的 TFM:
可移植到多個平台的應用程式應以基底 TFM 為目標,例如
net6.0
。 這包括大部分的程式庫,但也 ASP.NET Core和 Entity Framework。平台特定程式庫應以平台特定類別為目標。 例如,WinForms 和 WPF 專案應該以
net6.0-windows
為目標。跨平臺應用程式模型 (Xamarin Forms、ASP.NET Core) 和橋接器套件 (Xamarin Essentials) 至少應以基底 TFM 為目標,
net6.0
但也可能以其他平臺特定類別為目標,以啟動更多 API 或功能。
TFM 中的 OS 版本
您也可以在 OS 特定 TFM 結尾指定選擇性 OS 版本,例如 net6.0-ios15.0
。 版本會指出您的應用程式或程式庫可以使用哪些 API。 版本不會控制應用程式或程式庫在執行階段支援的 OS 版本。 其用來選取專案所編譯的參考元件,以及從 NuGet 套件中選取資產。 將此版本視為「平台版本」或「OS API 版本」,以釐清其與執行階段 OS 版本。
當 OS 特定的 TFM 未明確指定平台版本時,其具有可從基底 TFM 和平台名稱推斷的隱含值。 例如,.NET 6 中 iOS 的預設平臺值是 15.0
,這 net6.0-ios
表示是標準 net6.0-ios15.0
TFM 的速記。 較新基底 TFM 的隱含平台版本可能較高,例如,未來的 net8.0-ios
TFM 可能會對應至 net8.0-ios16.0
。 簡短表單僅供專案檔使用,並且會在傳遞至 NuGet 等其他工具之前,由 .NET SDK 的 MSBuild 目標擴充至標準表單。
.NET SDK 的設計目的是能夠支援個別平臺的新發行 API,而不需要新版本的基底 TFM。 這可讓您存取平臺特定功能,而不需要等待 .NET 的主要版本。 您可以藉由遞增 TFM 中的平台版本來取得這些新發行 API 的存取權。 例如,如果 iOS 平臺已在 .NET 6.0.x SDK 更新中新增 iOS 15.1 API,您可以使用 TFM net6.0-ios15.1
來存取它們。
支援舊版作業系統
雖然平台特定應用程式或程式庫是針對該 OS 特定版本的 API 進行編譯,但您可以將 SupportedOSPlatformVersion
屬性新增至專案檔,使其與舊版 OS 相容。 SupportedOSPlatformVersion
屬性指出執行應用程式或程式庫所需的最低 OS 版本。 如果您未在專案中明確指定此最小執行階段 OS 版本,則會預設為 TFM 的平台版本。
若要讓應用程式在舊版作業系統上正確執行,則其無法呼叫不存在於該作業系統版本的 API。 不過,您可以新增對較新 API 呼叫的防護,使其只在支援的作業系統版本上執行時呼叫。 此模式可讓您設計應用程式或程式庫,以支援在舊版作業系統上執行,同時利用較新的作業系統功能在較新的作業系統版本上執行。
平台相容性分析器會使用 SupportedOSPlatformVersion
值 (無論明確或預設),這會偵測並警告對較新 API 的未受防護呼叫。 其會以 UnsupportedOSPlatformAttribute 組件屬性的形式融入專案編譯的組件,讓平台相容性分析器可以從具有較低 SupportedOSPlatformVersion
值的專案中偵測該組件的未受防護呼叫。 在某些平台上,SupportedOSPlatformVersion
值會影響平台特定的應用程式封裝和建置程序,這些程序涵蓋在這些平台的文件中。
以下是使用 TargetFramework
和 SupportedOSPlatformVersion
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
目標 Framework 會在專案檔中指定。 指定單一目標 Framework 時,請使用 TargetFramework 項目。 下列主控台應用程式專案檔示範如何以 .NET 6 為目標:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>
當您指定多個目標 Framework 時,您可以有條件地參考每個目標 Framework 的組件。 在您的程式碼中,您可以使用前置處理器符號搭配 if-then-else 邏輯,有條件地對這些組件進行編譯。
下列程式庫專案以 .NET Standard () netstandard1.4
和 .NET Framework (和 net45
) net40
API 為目標。 使用具有多個目標 Framework 的複數 TargetFrameworks 項目。 當程式庫針對兩個.NET Framework TFM 進行編譯時,這些 Condition
屬性包括實作特定的套件:
<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>
您可以使用前置處理器指示詞,在程式庫或應用程式中撰寫條件程式碼,為每個目標 Framework 進行編譯:
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
}
}
前置處理器符號
當您使用 SDK 樣式專案時,組建系統知道代表目標 Framework 的前置處理器符號,如支援的目標 Framework 版本表格中所示。 若要將 .NET Standard、.NET Core 或 .NET 5+ TFM 轉換為預處理器符號、將點和連字號取代為底線,並將小寫字母變更為大寫 (例如,的 netstandard1.4
符號) NETSTANDARD1_4
。
您可以透過 DisableImplicitFrameworkDefines
屬性停用這些符號的產生。 如需此屬性的詳細資訊,請參閱 DisableImplicitFrameworkDefines。
.NET 目標架構的預處理器符號完整清單如下:
目標 Framework | 符號 | 其他符號 (.NET 5+ SDK) |
平台符號 (僅可於 指定 OS 特定 TFM 時使用) |
---|---|---|---|
.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+ (和 .NET Core) | NET , NET7_0 , NET6_0 , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_2 , NETCOREAPP2_1 , NETCOREAPP2_0 , NETCOREAPP1_1 , NETCOREAPP1_0 |
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 , 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
。 - 這些與 MSBuild
TargetFramework
屬性 和 NuGet 所使用的目標 Framework Moniker (TFM) 不同。
已被取代的目標 Framework
下列目標 Framework 已被取代。 以這些目標 Framework 為目標的套件應該移轉至所指出的取代項目。
已被取代的 TFM | 取代 |
---|---|
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 |