NetStandard擴(kuò)展支持實(shí)例分享-創(chuàng)新互聯(lián)

一. 方案的選擇

創(chuàng)新互聯(lián)公司專注于綏寧企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,購(gòu)物商城網(wǎng)站建設(shè)。綏寧網(wǎng)站建設(shè)公司,為綏寧等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

這個(gè)其實(shí)在上篇文章中已經(jīng)做了介紹,當(dāng)前.net core ,.net Framework,mono for Xarmain等都有自己的運(yùn)行時(shí),雖然使用的都是C#語(yǔ)法,但是類庫(kù)在不使用可移植或者標(biāo)準(zhǔn)庫(kù)的前提下不能直接互相調(diào)用。隨著.net standard 2.0的即將推出,.net core(asp.net core) 的應(yīng)用場(chǎng)景會(huì)越來(lái)越普遍,對(duì)舊有項(xiàng)目的兼容需求會(huì)越來(lái)越強(qiáng)烈,oss.common也是遇到這個(gè)問(wèn)題,所以我將對(duì)它進(jìn)行.net standard支持的擴(kuò)展。

由于當(dāng)前項(xiàng)目現(xiàn)在在好幾個(gè).net framework的項(xiàng)目中還在使用,為了舊項(xiàng)目中對(duì)net45的版本的支持不能丟失,所以我會(huì)保留兩套解決方案,一個(gè)為.net Standard 提供支持,一個(gè)為.net framework使用,兩個(gè)類庫(kù)項(xiàng)目,共享同一套代碼文件,針對(duì)Framework特有功能通過(guò)條件編譯來(lái)控制。github上目錄結(jié)構(gòu)已更新,歡迎查看。

二. 移植檢測(cè)

在移植之前我們需要對(duì)移植有個(gè)大概評(píng)估,了解需要代碼改動(dòng)的覆蓋面積,確定代碼的可移植性,這里推薦使用微軟官方提供的移植檢測(cè)工具(ApiPort),或者使用它的VS擴(kuò)展。這里我使用的是vs插件,安裝完插件之后,打開(kāi)解決方案,查看右鍵菜單會(huì)有如下兩個(gè)選項(xiàng):

Net Standard擴(kuò)展支持實(shí)例分享

首先,點(diǎn)擊第二個(gè)選項(xiàng),配置要檢測(cè)的移植對(duì)比版本,如下圖:

Net Standard擴(kuò)展支持實(shí)例分享

完成對(duì)應(yīng)的檢測(cè)版本之后點(diǎn)擊確定,點(diǎn)擊第一個(gè)選項(xiàng),執(zhí)行分析過(guò)程,會(huì)生成html和xsl兩種報(bào)表,html報(bào)表界面如下所示:

Net Standard擴(kuò)展支持實(shí)例分享

 報(bào)表中會(huì)給出對(duì)應(yīng)版本的接口覆蓋情況,以及相關(guān)的建議,可以說(shuō)是比較詳細(xì)了。

三.移植過(guò)程

經(jīng)過(guò)上邊的檢測(cè),可以看出oss.common項(xiàng)目 在.net standard1.4下,大概超過(guò)20%的代碼不能直接提供支持,我看了一下,主要集中在涉及配置,緩存,反射等特有屬性相關(guān)代碼中,這個(gè)還算在預(yù)期之中,不過(guò)看到一堆的紅叉叉還是一陣頭疼,沒(méi)辦法,自己的類庫(kù),哭著也要碼完,下邊介紹下移植的步驟。

1. 添加項(xiàng)目文件

為了項(xiàng)目直觀和方便管理,我將原來(lái)的OSS.Common類庫(kù)修改名稱為OSS.Common.NET45,新建一個(gè)OSS.Common的標(biāo)準(zhǔn)庫(kù)項(xiàng)目,兩個(gè)項(xiàng)目文件放在同一目錄下,說(shuō)明一下,vs2015如果要建標(biāo)準(zhǔn)庫(kù)項(xiàng)目需要先建可移植類庫(kù),在類庫(kù)屬性頁(yè)修改,如果不清楚請(qǐng)看上一篇文章介紹。

這個(gè)時(shí)候如果你直接生成OSS.Common.NET45的項(xiàng)目,是會(huì)出現(xiàn)報(bào)錯(cuò)的,哪怕你沒(méi)有做任何實(shí)際的代碼的操作,主要是因?yàn)樘砑涌梢浦差悗?kù)需要project.json的文件進(jìn)行依賴管理,當(dāng)他們?cè)谕荒夸浵聲r(shí),nuget會(huì)把project.json中的依賴默認(rèn)執(zhí)行還原操作,雖然你當(dāng)前是在生成OSS.Common.NET45項(xiàng)目,沒(méi)辦法,就是這么傻,如果你遇到了這個(gè)錯(cuò)誤,在當(dāng)前目錄中再建一個(gè)對(duì)應(yīng)當(dāng)前項(xiàng)目文件的project.json文件就好了,這里我添加了OSS.Common.Net45.project.json文件,文件中添加如下代碼:

{
"frameworks": {
"net45": {}
},
"runtimes": {
"win": {}
}
}

2. 代碼集成

新建好對(duì)應(yīng)的解決方案之后,把代碼文件附件到新建的標(biāo)準(zhǔn)庫(kù)下,這個(gè)時(shí)候直接生成會(huì)有很多錯(cuò)誤,這個(gè)時(shí)候我們就需要祭出條件編譯這個(gè)大招了,因?yàn)橐院笾饕蔷S護(hù)標(biāo)準(zhǔn)庫(kù),所以我在舊NET45的舊項(xiàng)目上新建了NETFW的條件編譯符號(hào) ,剩下的就是一個(gè)個(gè)錯(cuò)誤完善了。

在處理兼容的過(guò)程中,主要會(huì)面臨這幾個(gè)問(wèn)題,1. 標(biāo)準(zhǔn)庫(kù)完全不支持  2.  標(biāo)準(zhǔn)庫(kù)和Framework的調(diào)用方法不一樣, 3. 可以間接完成標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)

這里我把我遇到的情況各舉一個(gè)例子供大家參考:

1.  標(biāo)準(zhǔn)庫(kù)完全不支持,這個(gè)最典型的就是緩存模塊,在.net standard下,System.Runtime.Caching類庫(kù)完全被移除了,沒(méi)辦法,只能使用#if NETFW 完全把Module模塊下的默認(rèn)Cache實(shí)現(xiàn)給屏蔽了,只能在Framework下才能使用默認(rèn)實(shí)現(xiàn)(本來(lái)打算自己實(shí)現(xiàn)一個(gè)緩存類的,不過(guò)發(fā)現(xiàn)可能會(huì)帶來(lái)不可預(yù)知bug,作廢)。

2. 標(biāo)準(zhǔn)庫(kù)和Framework的調(diào)用方法不一樣,舉個(gè)例子就是Type類型下的IsEnum屬性,在net standard下需要.gettypeinfo().IsEnum才可以,舉例代碼:

#if NETFW
if (!enType.IsEnum)
#else
if (!enType.GetTypeInfo().IsEnum)
#endif

3. 可以間接完成標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn),這常見(jiàn)的如 list的ConvertAll方法,在Framework下有默認(rèn)實(shí)現(xiàn)的,標(biāo)準(zhǔn)庫(kù)下是沒(méi)有的,這里我在ConvertExtention類自己定義了個(gè)一個(gè):

#if !NET40
public static List<TResult> ConvertAll<TPara, TResult>(this List<TPara> list, Func<TPara, TResult> func)
{
if (list == null)
return null;
var resultList = new List<TResult>(list.Count);
list.ForEach(e => resultList.Add(func(e)));
return resultList;
}
#endif

 當(dāng)然還會(huì)有其他的一些問(wèn)題,不過(guò)還好,基本都已經(jīng)解決,如果有不清楚的可以去下載oss.common代碼自行查看

四. nuget打包部署

這個(gè)相對(duì)簡(jiǎn)單,在兩個(gè)解決方案中分別生成對(duì)應(yīng)的dll,在lib文件夾中分別添加net45 和 netstandard1.4 文件夾添加對(duì)應(yīng)的dll就行。

需要注意的一點(diǎn)就是,最好添加個(gè)各自的依賴,舉個(gè)例子,標(biāo)準(zhǔn)庫(kù)的Hmacsha1加密算法在“System.Security.Cryptography.Algorithms” dll程序集下,如果在調(diào)用項(xiàng)目中沒(méi)有引用這個(gè)dll,生成是不會(huì)報(bào)錯(cuò)的,但是當(dāng)代碼執(zhí)行調(diào)用的時(shí)候就會(huì)彈出程序集未找到的錯(cuò)誤,當(dāng)然如果發(fā)現(xiàn)這個(gè)問(wèn)題也可以通過(guò)nuget線上安裝命令(install-package)安裝。

給大家看下我的nuget文件配置:

Net Standard擴(kuò)展支持實(shí)例分享

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站標(biāo)題:NetStandard擴(kuò)展支持實(shí)例分享-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article46/dhsheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、面包屑導(dǎo)航、App開(kāi)發(fā)、全網(wǎng)營(yíng)銷推廣標(biāo)簽優(yōu)化、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)