国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

.Net基礎(chǔ)體系和跨框架開發(fā)普及

2019-11-11 04:33:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  .net體系經(jīng)過(guò)十幾年發(fā)展,發(fā)生了很多變化。特別是在最近兩年,隨著開源和跨平臺(tái)的發(fā)展,衍生出很多概念,像標(biāo)準(zhǔn)庫(kù),可移植庫(kù),.Net Core等,相信有不少同學(xué)對(duì)他們之間的關(guān)系是有一些困惑的,這里我從基礎(chǔ)概念,跨框架開發(fā)的注意事項(xiàng)等,對(duì).net的平臺(tái)和相關(guān)概念做一個(gè)普及分享。此分享是從個(gè)人的知識(shí)體系中總結(jié),如有不足,歡迎勘誤!

一. 基礎(chǔ)概念

  .Net 本身是一個(gè)通用開發(fā)平臺(tái),我個(gè)人的理解主要分位如下三個(gè)層面:1. 語(yǔ)言層面,2. 運(yùn)行時(shí)

  首先:在語(yǔ)言層面上

  面向 .net 平臺(tái)的頂層開發(fā)語(yǔ)言有很多,常見的如:C#,F(xiàn)#和Visual Basic等,.net框架提供了這些語(yǔ)言使用的公共語(yǔ)言運(yùn)行時(shí),運(yùn)行時(shí)與具體的語(yǔ)言無(wú)關(guān),它定義了這些語(yǔ)言的公共規(guī)范,像類型系統(tǒng),文件格式等。

  這些高級(jí)語(yǔ)言編寫的代碼被稱為托管代碼,這些代碼需要通過(guò)編譯器編譯為中間代碼(IL),然后由公共語(yǔ)言運(yùn)行時(shí)(CLR)接管,再經(jīng)過(guò)JIT編譯為機(jī)器代碼交給cpu運(yùn)行。

  公共語(yǔ)言運(yùn)行時(shí)自動(dòng)處理對(duì)象布局并管理對(duì)象引用,當(dāng)不再使用對(duì)象時(shí)釋放它們。 按這種方式實(shí)現(xiàn)生存期管理的對(duì)象稱為托管數(shù)據(jù)。 垃圾回收消除了內(nèi)存泄漏以及其他一些常見的編程錯(cuò)誤。

  其次:運(yùn)行時(shí)層面

  當(dāng)前.net的運(yùn)行時(shí)主要有.Net Framework, Mono for Xamarin和.Net Core 。這些運(yùn)行時(shí)在不同是時(shí)期主要是為了解決當(dāng)時(shí)所面臨的問(wèn)題衍生而出,這里介紹下他們相互的關(guān)聯(lián)和職責(zé)。

  1. .Net Framework ,這個(gè)是自2002年就已存在的.Net運(yùn)行時(shí),也是現(xiàn)在開發(fā)人員還在經(jīng)常使用的框架。涵蓋了桌面,web等應(yīng)用,同時(shí)包含了一些特定于windows的api,不過(guò)其只能運(yùn)行在windows平臺(tái)的限制,給對(duì)跨系統(tǒng)平臺(tái)要求較高的開發(fā)需求造成很大的困難,非常適合用于桌面應(yīng)用的開發(fā)。

  2. Mono for Xamarin ,這個(gè)是當(dāng)時(shí)為了實(shí)現(xiàn).net 的跨系統(tǒng)運(yùn)行,在2004年非官方組織發(fā)布的一個(gè).Net運(yùn)行時(shí),當(dāng)時(shí)主要是能夠支持在.net framework下編寫的代碼在linux等系統(tǒng)下運(yùn)行,當(dāng)前主要包含適用于 iOS、Android、Xamarin.Forms 和 Xamarin.Mac 的 API。 Mono for Xamarin 非常適合生成 iOS 和 Android 移動(dòng)應(yīng)用程序。

  3. .Net Core 這個(gè)是微軟官方發(fā)布的.Net運(yùn)行時(shí),主要為了打破.net framework的系統(tǒng)限制,實(shí)現(xiàn)跨操作系統(tǒng)平臺(tái)的開發(fā),在一定程序上正在取代后者,官方定義它是 asp.net Core 和通用 Windows 平臺(tái) (UWP) 所使用的運(yùn)行時(shí)。 它新式、高效,專用于處理大規(guī)模的服務(wù)器和云工作負(fù)荷。

  這三個(gè)運(yùn)行時(shí),.Net 開發(fā)人員一定要有一個(gè)清醒的認(rèn)識(shí),他們之間的關(guān)系見下圖,我們搞清楚運(yùn)行時(shí)之間的關(guān)系之后,就可以繼續(xù)了解三者之間類庫(kù)框架的關(guān)系了

  

二.  跨框架開發(fā)介紹

  上邊主要介紹的是當(dāng)前的.net 平臺(tái)的基信息,同時(shí),因?yàn)橄到y(tǒng)支持的不同,在不同運(yùn)行時(shí)下的支持框架又會(huì)有自己不同的特性。 特別是在.Net Core 的逐漸成熟,新舊項(xiàng)目的跨框架支持的需求會(huì)越來(lái)越多,如何跨框架類庫(kù)共享,舊項(xiàng)目如何擴(kuò)展支持是個(gè)不得不面對(duì)的問(wèn)題。

  如何跨框架開發(fā),微軟在這個(gè)問(wèn)題上先后給出了兩個(gè)解決方案,一是創(chuàng)建多目標(biāo).net core 項(xiàng)目,第二個(gè)是創(chuàng)建可移植類庫(kù)(Portable)或標(biāo)準(zhǔn)庫(kù)(.Net Standard),第一種方式的實(shí)現(xiàn)我會(huì)在下邊的實(shí)現(xiàn)中講解,這里先介紹下第二種方式的由來(lái),這兩種在作用上目的是一樣的,只是范圍和方式略微有所不同,其中.Net Standard 被認(rèn)為是最好的解決方案。

  .Net Standard的官方解釋是:.NET 標(biāo)準(zhǔn)庫(kù)是一套正式的 .NET API 規(guī)范,有望在所有 .NET 運(yùn)行時(shí)中推出。 推出標(biāo)準(zhǔn)庫(kù)的動(dòng)機(jī)是在 .NET 生態(tài)系統(tǒng)中建立更好的統(tǒng)一性。 ECMA 335 持續(xù)為 .NET 運(yùn)行時(shí)行為建立統(tǒng)一性,但適用于 .NET 庫(kù)實(shí)現(xiàn)的 .NET 基類庫(kù) (BCL) 沒有類似的規(guī)范。

  其主要目的就是規(guī)范 .net 不同運(yùn)行時(shí)下的框架,提出一套可以通用的api標(biāo)準(zhǔn)。先來(lái)看看當(dāng)前微軟官方框架以及當(dāng)前版本的詳細(xì)信息:

  也就是其他框架可以實(shí)現(xiàn)自己的特性,但同時(shí)也要實(shí)現(xiàn)對(duì)應(yīng)的.net standard框架api,那么就可以在有需求的框架類庫(kù)中直接使用對(duì)應(yīng)版本的.net standard框架的類庫(kù)。下邊給出.net standard和其他框架(圖中叫平臺(tái))的版本對(duì)照關(guān)系:

  如果我們需要新建的項(xiàng)目能夠同時(shí)支持.net core 和 .net framework那么我們只需要在vs 2017中新建一個(gè).net standard類庫(kù)就好了,如果你使用的是vs2015,那你可以新建 可移植類庫(kù)[英文版對(duì)應(yīng): Class Library (Portable) ],然后在屬性的窗口下切換到.Net Standard 類庫(kù)即可。

  可移植類庫(kù)和標(biāo)準(zhǔn)庫(kù)目的都是一樣,主要是影響的上有所不同,新建可移植類庫(kù)是會(huì)讓你選擇對(duì)應(yīng)的框架,當(dāng)前類庫(kù)的實(shí)現(xiàn)接口取所選框架的交集,而標(biāo)準(zhǔn)庫(kù)則和具體框架無(wú)關(guān),對(duì)應(yīng)版本的接口都已規(guī)范好。

  

三.  跨框架開發(fā)實(shí)現(xiàn)

  當(dāng)你需要同時(shí)對(duì)單一項(xiàng)目提供對(duì).net core 和framework的支持,有兩種情況我們可以選擇,分別是直接建立.net core多目標(biāo)項(xiàng)目和 建立可移植類庫(kù)或者標(biāo)準(zhǔn)庫(kù)

  1. 使用多目標(biāo).net core 項(xiàng)目

  使用這個(gè)方式主要場(chǎng)景是 必須對(duì)某些項(xiàng)目提供framework的特殊功能支持,同時(shí)又不希望建立兩個(gè)獨(dú)立的項(xiàng)目。

  這種方式的好處是單個(gè)項(xiàng)目能夠快速編譯出不同的目標(biāo)版本dll,劣勢(shì)是可能無(wú)法在同一解決方案中直接引用當(dāng)前項(xiàng)目。

  實(shí)現(xiàn)方式:

  a. 新建.net core 項(xiàng)目

  b. 修改PRoject.json文件,添加framework的版本,如:

 

  c. 針對(duì)特定目標(biāo)的代碼,直接使用條件編譯符號(hào)即可,這里是對(duì)應(yīng)的目標(biāo)版本對(duì)應(yīng)關(guān)系,也是條件編譯的變量名:

  .NET Framework 2.0 --> net20  .NET Framework 3.0 --> net30  .NET Framework 3.5 --> net35  .NET Framework 4.0 --> net40  .NET Framework 4.5 --> net45  .NET Framework 4.5.1 --> net451  .NET Framework 4.5.2 --> net452  .NET Framework 4.6 --> net46  .NET Framework 4.6.1 --> net461  .NET Framework 4.6.2 --> net462  .NET Framework 4.6.3 --> net463

  d. 編譯生成即可,可以去debug文件夾下查看對(duì)應(yīng)目標(biāo)的dll

  

  2. 使用標(biāo)準(zhǔn)庫(kù)或者可移植類庫(kù),這個(gè)比較簡(jiǎn)單,只是vs2017才支持直接創(chuàng)建標(biāo)準(zhǔn)庫(kù)項(xiàng)目,如果在2015中有需要可以先創(chuàng)建可移植項(xiàng)目,去屬性頁(yè)修改目標(biāo)即可,如圖:

以上是我個(gè)人對(duì)當(dāng)前.Net體系下的理解,這里給出官方的完整平臺(tái)圖譜:

 

下篇文章我將實(shí)戰(zhàn)演示OSS.Common項(xiàng)目的遷移過(guò)程,如果你有興趣,可以添加公眾號(hào)(osscoder):

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 曲沃县| 曲靖市| 长春市| 房山区| 库车县| 宜丰县| 古蔺县| 阿拉善左旗| 永济市| 涞源县| 会泽县| 揭阳市| 桐庐县| 池州市| 石阡县| 余江县| 合阳县| 通海县| 施甸县| 蓬莱市| 永善县| 松江区| 姜堰市| 青河县| 盐山县| 双鸭山市| 丘北县| 湾仔区| 林州市| 汽车| 广州市| 富源县| 齐河县| 丹棱县| 星座| 淅川县| 阜宁县| 虞城县| 衡水市| 灵寿县| 山丹县|