SDK 樣式專案中的目標架構
當您以應用程式或程式庫中的架構為目標時,您將指定要提供給應用程式或程式庫的一組 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 版本是最新穩定版本。 不會顯示發行前版本。 目標 Framework Moniker (TFM) 是一種標準化的權杖格式,用於指定 .NET 應用程式或程式庫的目標架構。
| 目標架構 | 最新 穩定版本 |
目標 Framework Moniker (TFM) | 已實作 .NET Standard 版本 |
|---|---|---|---|
| .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 通常會由 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* |
| .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 和更新版本的 TPM 包含一些作業系統特定的變化。 如需詳細資訊,請參閱下一節 .NET 5+ OS 特定 TPM。
.NET 5+ OS 特定 TPM
net5.0和 net6.0 TPM 包含跨不同平臺運作的技術。 指定OS 特定的 TFM可讓應用程式使用作業系統專用的 API,例如Windows Forms或 iOS 系結。 OS 特定的 TFM 也會繼承其基底 TFM 可用的每個 API,例如 net5.0 TFM。
.NET 5 引進 net5.0-windows 了 OS 特定的 TFM,其中包含適用于 WinForms、WPF 和 UWP API 的 Windows 特定系結。 .NET 6 引進了進一步的 OS 特定 TPM。
下表顯示 .NET 5+ TFM 的相容性。
| TFM | 與 相容 |
|---|---|
| net5.0 | net1..4 (NU1701 警告) netcoreapp1..當參考 WinForms 或 WPF 時,3.1 (警告) 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-macos | xamarin.mac (+繼承自 net6.0) |
| net6.0-maccatalyst | xamarin.ios (+繼承自 net6.0) |
| net6.0-tvos | xamarin.tvos (+繼承自 net6.0) |
| net6.0-windows | (後續版本的 net5.0-windows) |
若要讓您的應用程式可移植到不同的平臺,但仍可存取 OS 特定的 API,您可以使用預處理器指示詞,以多個 OS 特定的 #if TPM 為目標,並新增平臺防護。
建議的目標
使用這些指導方針來判斷應用程式中要使用的 TFM:
可移植到多個平臺的應用程式應以基底 TFM 為目標,例如
net5.0。 這包括大部分的程式庫,但也 ASP.NET Core和 Entity Framework。平臺特定程式庫應以平臺特定類別為目標。 例如,WinForms 和 WPF 專案的目標應該是
net5.0-windows或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 15.0 中 iOS 的預設平臺值為 ,這表示 net6.0-ios 為標準 net6.0-ios15.0 TFM 的速記。 較新基底 TFM 的隱含平臺版本可能較高,例如,未來的 net7.0-ios TFM 可能會對應至 net7.0-ios16.0 。 速記表單僅供專案檔使用,並且會先由 .NET SDK 的 MSBuild 目標擴充至標準表單,再傳遞至其他工具,例如 NuGet。
.NET SDK 的設計目的是要能夠支援個別平臺的新發行 API,而不需要新版本的基底 TFM。 這可讓您存取平臺特定功能,而不需要等候 .NET 的主要版本。 您可以藉由遞增 TFM 中的平臺版本來取得這些新發行 API 的存取權。 例如,如果 iOS 平臺已在 .NET 6.0.x SDK 更新中新增 iOS 15.1 API,您可以使用 TFM net6.0-ios15.1 來存取它們。
支援較舊的 OS 版本
雖然平臺特定應用程式或程式庫是針對該 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 時,請使用 TargetFramework 元素。 下列主控台應用程式專案檔示範如何以 .NET 5 為目標:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
當您指定多個目標 Framework 時,您可以有條件地參考每個目標 Framework 的組件。 在您的程式碼中,您可以使用前置處理器符號搭配 if-then-else 邏輯,有條件地對這些組件進行編譯。
下列程式庫專案以 .NET Standard () netstandard1.4 和 .NET Framework (和 net45) net40 API 為目標。 使用具有多個目標架構的複數 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>
在您的程式庫或應用程式中,您可以使用 預處理器指示詞 撰寫條件式程式碼,以針對每個目標架構進行編譯:
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 版本資料表中顯示的目標架構 預處理器符號。 使用代表 .NET Standard、.NET Core 或 .NET 5+ TFM 的符號時,以底線取代點和連字號,並將小寫字母變更為大寫 (例如,的 netstandard1.4 符號會 NETSTANDARD1_4) 。 您可以透過 DisableImplicitFrameworkDefines 屬性停用產生這些符號。 如需此屬性的詳細資訊,請參閱 DisableImplicitFrameworkDefines。
.NET 目標架構的預處理器符號完整清單如下:
| 目標 Framework | 符號 | .NET 5+ SDK 中可用的其他符號 |
|---|---|---|
| .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, 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 |
注意
- 不論您要鎖定的版本為何,都會定義無版本符號。
- 版本特定符號只會針對您要鎖定的版本定義。
- 系統會
<framework>_OR_GREATER針對您要鎖定的版本和所有舊版定義符號。 例如,如果您要以 .NET Framework 2.0 為目標,則會定義下列符號:NET20、NET20_OR_GREATER、NET11_OR_GREATER和NET10_OR_GREATER。 - 這些與 MSBuild
TargetFramework屬性 和 NuGet 所使用的目標 Framework Moniker (TPM) 不同。
已被取代的目標 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 |