官术网_书友最值得收藏!

第3章 .NET Standard

3.1 .NET Standard介紹

.NET Standard是一種規(guī)范,是所有.NET平臺(tái)必須實(shí)現(xiàn)的一組API。我們可以把.NET Standard視為適用.NET的POSIX(可移植操作系統(tǒng)接口)。

.NET Standard可實(shí)現(xiàn)以下重要情境:

●為所有.NET實(shí)現(xiàn)定義一組統(tǒng)一的、與工作負(fù)荷無(wú)關(guān)的BCL API。

●使開發(fā)人員能夠通過(guò)同一組API生成可在各種.NET實(shí)現(xiàn)中使用的可移植庫(kù)。

●減少甚至消除由.NET API導(dǎo)致的對(duì)共享源代碼進(jìn)行的條件性編譯(僅適用于OS API)。

各種.NET實(shí)現(xiàn)以特定版本的.NET Standard為目標(biāo)。每個(gè).NET實(shí)現(xiàn)版本都會(huì)公布它支持的最高.NET Standard版本,這種聲明意味著它也支持以前的版本。例如,.NET Framework 4.6實(shí)現(xiàn).NET Standard 1.3。也就是說(shuō),它會(huì)公開在.NET Standard版本1.0到1.3中定義的所有API。同理,.NET Framework 4.6.1實(shí)現(xiàn).NET Standard 1.4,而.NET Core 1.0則實(shí)現(xiàn).NET Standard 1.6。

3.1.1 版本

表3-1列出了支持每個(gè).NET Standard版本的最低平臺(tái)版本。

表3-1

說(shuō)明如下:

●N/A表示.NET Framework不支持.NET Standard 2.1或更高版本。

●各單元格中的版本號(hào)指示要定向到此.NET Standard版本所需的最低實(shí)現(xiàn)版本。

若要查找可以定位的.NET Standard最高版本,則按照以下步驟操作即可:

①查找要運(yùn)行的.NET實(shí)現(xiàn)所在的行。

②在這一行中,從右向左查找可以定位的.NET Standard版本所在的列。

③列標(biāo)題指示目標(biāo)支持的.NET Standard版本。

④對(duì)要定位的每個(gè)平臺(tái)重復(fù)執(zhí)行此過(guò)程。如果有多個(gè)目標(biāo)平臺(tái),則選擇它們都支持的最高版本。例如,如果要在.NET Framework 4.5和.NET Core 1.0上運(yùn)行,則可以使用的最高.NET Standard版本是.NET Standard 1.1。

1.應(yīng)使用哪個(gè).NET Standard版本

在選擇.NET Standard版本時(shí),應(yīng)權(quán)衡以下因素:

●版本越高,可使用的API越多。

●版本越低,可實(shí)現(xiàn)的平臺(tái)越多。

通常,建議盡可能使用最低版本的.NET Standard。因此,在找到可以指向的最高版本.NET Standard后,請(qǐng)按照以下步驟操作:

①指向前一更低版本的.NET Standard,然后生成項(xiàng)目。

②如果成功生成項(xiàng)目,則重復(fù)執(zhí)行第①步。否則,重新指向下一個(gè)較高的版本,這就是應(yīng)該使用的版本。

但是,針對(duì)較低版本的.NET Standard會(huì)引入許多支持依賴項(xiàng)。如果項(xiàng)目面向.NET Standard 1.x,則建議同時(shí)使用.NET Standard 2.0。這簡(jiǎn)化了在.NET Standard 2.0上運(yùn)行的庫(kù)用戶的依賴項(xiàng)關(guān)系,并減少了需要下載的軟件包數(shù)量。

2..NET Standard版本控制規(guī)則

版本控制規(guī)則主要有兩個(gè):

●累加性:.NET Standard版本在邏輯上形成同心圓。也就是說(shuō),較高的版本包含較低的版本的所有API。版本之間沒(méi)有重大更改。

●不可變:一旦發(fā)布,.NET Standard版本就會(huì)被凍結(jié)起來(lái)。新API首先會(huì)在特定的.NET實(shí)現(xiàn)(如.NET Core)中可用。如果.NET Standard評(píng)審委員會(huì)認(rèn)為新API可應(yīng)用于所有.NET實(shí)現(xiàn),則會(huì)將它們添加到新的.NET Standard版本中。

3.1.2 規(guī)范

.NET Standard規(guī)范是一組標(biāo)準(zhǔn)化的API,此規(guī)范由.NET實(shí)現(xiàn)者進(jìn)行維護(hù),具體來(lái)說(shuō),就是由Microsoft(包括.NET Framework、NET Core和Mono)和Unity進(jìn)行維護(hù)。

1.正式規(guī)范

正式規(guī)范是一組用于定義標(biāo)準(zhǔn)中包含API的.cs文件。dotnet/standard倉(cāng)庫(kù)中的Ref目錄定義了.NET Standard API。

NETStandard.Library元包描述用于部分定義一個(gè)或多個(gè).NET Standard版本的庫(kù)集。

給定的組件(如System.Runtime)描述如下:

●.NET Standard的一部分(即其范圍)。

●.NET Standard在此范圍內(nèi)的多個(gè)版本。

標(biāo)準(zhǔn)庫(kù)提供派生項(xiàng)目以方便讀取,并實(shí)現(xiàn)某些開發(fā)人員方案(例如,使用編譯器):

●Markdown中的API列表;

●引用程序集,以NuGet包的形式分發(fā),由NETStandard.Library元包引用。

2.包表示形式

.NET Standard引用程序集的主要分發(fā)載體是NuGet包。NuGet包面向一個(gè)或多個(gè)框架,其定位是“.NET Standard”框架。可以使用netstandard精簡(jiǎn)TFM(例如netstandard1.4)來(lái)設(shè)定.NET Standard框架作為目標(biāo)。如果構(gòu)建的庫(kù)將在多個(gè)運(yùn)行時(shí)上運(yùn)行,則應(yīng)將此框架作為目標(biāo)。對(duì)于最廣泛的API集,可將netstandard2.0設(shè)定為目標(biāo),因?yàn)?NET Standard 2.0的可用API數(shù)量比.NET Standard 1.6的兩倍還多。

NETStandard.Library元包引用定義.NET Standard的一整套NuGet包。要指定netstandard作為目標(biāo),最常見(jiàn)的方法是引用此元包。它描述并提供了對(duì)大約40個(gè).NET庫(kù)及定義.Net Standard的相關(guān)API的訪問(wèn)權(quán)限。可以引用以netstandard為目標(biāo)的其他包來(lái)使用其他API。

3.版本管理

規(guī)范并不是單一的,而是一組版本不斷呈線性遞增的API。該標(biāo)準(zhǔn)的第一個(gè)版本建立了一組基準(zhǔn)API。后續(xù)版本將添加API,并繼承以前版本定義的API。在從標(biāo)準(zhǔn)中移除API方面,并沒(méi)有成文的規(guī)定。

.NET Standard并不特定于任何一種.NET實(shí)現(xiàn),也不與其中任一運(yùn)行時(shí)的版本控制方案匹配。

添加到任何實(shí)現(xiàn)(例如.NET Framework、.NET Core和Mono)的API可被視為適合添加到規(guī)范中的候選項(xiàng),尤其是本質(zhì)上非常重要的API。.NET Standard的新版本根據(jù).NET實(shí)現(xiàn)版本進(jìn)行創(chuàng)建,以便可以定位.NET Standard PCL中的新API。.NET Core版本控制中詳細(xì)介紹了版本控制機(jī)制。

.NET Standard版本控制對(duì)于庫(kù)的使用至關(guān)重要。在.NET Standard版本既定的情況下,可以使用指向相同或更低的版本的庫(kù)。下面介紹使用.NET Standard PCL(專用于.NET Standard定位)的工作流程。

●選擇要用于PCL的.NET Standard版本。

●使用依賴相同或更低.NET Standard版本的庫(kù)。

●如果發(fā)現(xiàn)依賴更高.NET Standard版本的庫(kù),要么采用相同的版本,要么不要使用此庫(kù)。

3.1.3 .NET Framework兼容性模式

從.NET Standard 2.0開始,引入了.NET Framework兼容性模式。此兼容性模式允許.NET Standard項(xiàng)目引用.NET Framework庫(kù),就像其針對(duì).NET Standard編譯一樣。引用.NET Framework庫(kù)并不適用于所有項(xiàng)目,例如使用Windows Presentation Foundation(WPF)API的庫(kù)。

3.1.4 .NET Standard庫(kù)和Visual Studio

要在Visual Studio中生成.NET Standard庫(kù),請(qǐng)確保在Windows系統(tǒng)上已安裝Visual Studio 2017的15.3版本或更高版本,或在macOS上已安裝Visual Studio for Mac的7.1版本或更高版本。

如果項(xiàng)目中只需使用.NET Standard 2.0庫(kù),也可以在Visual Studio 2015中執(zhí)行此操作。但是需要安裝NuGet Client 3.6或更高版本。可以從NuGet下載頁(yè)面下載適用Visual Studio 2015的NuGet客戶端。

3.1.5 .NET Standard圖解

圖3-1形象地描述了.NET Standard。

圖3-1

從圖3-1中可以看出,.NET Standard適用于WPF、Windows Forms、ASP.NET、UWP、ASP.NET Core,基于Xamarin支持iOS、OS X和Android。

主站蜘蛛池模板: 渑池县| 奎屯市| 齐齐哈尔市| 南川市| 集安市| 祁东县| 宁南县| 绥化市| 连城县| 张家港市| 青海省| 永丰县| 汪清县| 尉犁县| 侯马市| 沙坪坝区| 项城市| 贞丰县| 涟源市| 宜春市| 盐城市| 股票| 玉林市| 郓城县| 巨野县| 简阳市| 方山县| 罗田县| 玉树县| 吉木乃县| 滕州市| 长治市| 和平县| 马山县| 云梦县| 额济纳旗| 哈尔滨市| 汉阴县| 镇巴县| 石首市| 岚皋县|