學習新的開發框架是一項巨大的投資。您須要學習如何在新框架中編寫,構建,測試,部署和維護應用程序。做爲開發人員,有許多框架可供選擇,很難知道什麼是最適合的。即便您正在使用.NET開發軟件,.NET Core也不相同,您須要花時間學習使用它的工具和技術。爲了理解爲何.NET Core值得一看,這有助於知道你從哪裏開始。php
.NET Core從屬於.NET基金會,由微軟進行官方支持。使用最寬鬆的MIT和Apache 2開源協議,文檔協議遵循CC-BY。這將容許任何人任何組織和企業任意處置,包括使用,複製,修改,合併,發表,分發,再受權,或者銷售。惟一的限制是,軟件中必須包含上述版 權和許可提示,後者協議將會除了爲用戶提供版權許可以外,還有專利許可,而且受權是免費,無排他性的(任何我的和企業都能得到受權)而且永久不可撤銷,相較於oracle對java和mysql的開源協議微軟作出了最大的誠意html
.NET Core是爲了從新啓動某些Framework組件而爲其餘人提供跨平臺工做的機會。因爲.NET Framework主要以託管(C#)代碼爲基礎構建,所以這些部分不須要更改代碼便可移至.NET Core。依賴於Windows特定組件的庫必須被移除或重構以使用跨平臺替代方案。這一樣適用於您的應用程序。java
您現有的.NET Framework應用程序能夠在其餘操做系統上工做。對於但願擴大類庫的受衆平臺,或者但願在分佈式應用程序的其餘領域使用相同代碼的開發人員來講,這是很是好的選擇。即便你想用你亮瞎眼的MacBook上開發.NET,而無需雙啓動到Windows。node
並非全部的框架都被移植到.NET Core,但主要的部分。存在一些API差別。例如,若是您使用了大量的反射,則可能須要重構代碼才能使用Core。有關更多信息,請看文章末尾的的二者差別部分。mysql
ASP.NET Core和ASP.NET之間的性能差別是幾個數量級。大部分的ASP.NET被傳統的System.Web庫所限制。.NET Framework支持舊版本的ASP.NET項目,並且這個約束限制了ASP.NET的發展。微軟決定重寫整個架構。這意味着打破變化,但結果是值得的。web
向後兼容性是一把雙刃劍。這意味着您的應用程序能夠繼續獲得新版本框架的支持,確保在新版本框架中所作的更改不會破壞現有的應用程序。
sql
全部的努力避免變化都限制了框架的創新。框架的變化須要完全的理由(一般來自客戶),詳盡的測試以及來自多個層次產品組的批准。
安全
使用.NET Core,團隊能夠更容易專一的在.net core上工做。好比核心類庫(如System.Collections)的更改仍然須要與.NET Framework相同的活力,可是ASP.NET Core或Entity Framework Core能夠更輕鬆地進行實質性更改,而不受向後兼容性的限制。這容許更大的創新。網絡
.NET Framework做爲一個總體產品發佈,可是.NETCore被分解成多個部分。如今開發人員能夠選擇使用哪一個版本的庫。只要它在.NET標準庫以外,.NET Core團隊就能夠用較少的難度進行創新。這就是爲何在未來你只能看到錯誤修復的框架; .net core將得到全部新功能。架構
若是您曾在框架中遇到錯誤,並將其報告給Microsoft,則您將知道發佈修復須要多長時間。這個框架有很長的發佈週期,一般至少要測量一年,並且在這些週期中還有很小的窗口用於特性工做。每一個代碼更改均可能會致使框架中其餘位置出現意外的問題。爲了給每一個團隊足夠的時間來測試框架,有不少時候代碼更改是受限制的或者嚴格審查的。若是您在.NET中發現了一個錯誤,最好找到一個解決方法,而不是等待更新(這也是.NETCore開源帶來的好處,您不須要徹底依賴微軟支持才能解決問題,這對於大型企業更是有利,能夠利用技術資源來對.NETCore進行本企業定製化,成爲.NETCore的分支來運行)。
.NET Core遵循更快的發佈步調。開發人員可使用夜間構建來儘早測試。不屬於.NET標準庫的庫能夠按本身的步調發布。由於全部東西都是開源的,若是微軟沒有足夠快的響應,任何開發者均可以提出修補。若是解決方法不被接受,討論就會公開進行,全部人均可以看到爲何作出這個決定
在Windows平臺上,.NET框架沒有太多的競爭。微軟能夠對從操做系統內核層到高級.NET庫的全部內容進行更改。經過將.NET引入其餘平臺,競爭環境發生了變化。.NET如今必須與其餘全部的開發框架競爭。
.NET的旗艦語言C#具備許多獨特的功能,例如語言集成查詢和異步構造,這使得它強大且易於使用。相較於保守的java(咱們也看到Oracle旗下的老牌java已經已經愈來愈難推出新特性,這是歷史包袱所致使,在未來模塊化的開發中很難進行更新維護)C#也在不斷創新。C#團隊公開設計語言,由於他們但願任何人提出建議或參與討論。編譯器(Roslyn)徹底是模塊化和可擴展的。
若是您正在編寫Web應用程序或服務,那麼ASP.NET Core是一個很好的搭建平臺。它具備出色的性能和低內存佔用。許多功能可使您的應用程序更容易開發和維護。
.NET在2000年之前就已經出現了。框架代碼在過去幾年中已經獲得了鞏固,開發人員也從中受益。已經被移植到Core的大部分Framework代碼都沒有改變。這使.NET Core在構建應用程序的可靠框架方面領先一步。.NET Core也徹底由Microsoft支持還有愈來愈活躍的開源社區例如紅帽組織。這下降了爲您的應用程序使用Core的風險。
爲了理解.NET Core,它有助於理解.NET Framework。微軟在21世紀初發布了.NET Framework。.NET Framework是一個僅限於Windows的開發框架,它在最底層提供了內存管理,安全性,異常處理和許多其餘功能。.NET框架附帶一大堆庫,可執行從XML解析到HTTP請求的各類功能。它還支持幾種語言,並將它們編譯成相同的通用中間語言; 任何語言均可以使用任何其餘語言構建的庫。這些關鍵概念也出如今.NET Core中。
2016年,微軟收購了Xamarin併發布了.NET Core 1.0。以前Xamarin已經移植了.NET框架的大部份內容來運行在基於Linux / Unix的操做系統上。一些代碼能夠在.NET Framework,Xamarin和新的.NET Core之間共享,但編譯後的二進制文件不能。.NET Core的一部分努力是建立一個標準化的平臺,容許全部.NET實現共享相同的庫。
圖1 .NET框架,.NET Core和Xamarin都共享一個稱爲.NET標準庫的標準化平臺
之前的Xamarin和.NET Framework之間是沒法共享二進制文件的。隨着.NET標準庫和通用基礎架構的推出,這兩個框架如今成爲統一的.NET生態系統的一部分。
什麼是.NETCore?在上圖中,彷佛.NET Core是另外一個包含UWP(通用Windows平臺)和ASP.NET Core的框架。爲了使.NET Core成爲現實,建立了.NET標準庫和通用基礎架構。
.NET Core借鑑了.NET Framework的最佳實踐,並將軟件工程的最新進展結合在一塊兒。這些是.NET Core的一些顯着特徵。
使用.NET Core,您可使用.NET標準庫編寫應用程序或庫。
而後它能夠在許多平臺上共享。
圖2 .NETCore開發
同一個庫能夠在後臺服務「本地」或雲中運行,也能夠在手機,平板電腦或桌面上運行的客戶端應用程序中運行。與其爲iOS,Android和Windows構建單獨的應用程序,您能夠構建一個適用於全部平臺的應用程序。.NET Core是小型和完美的容器,能夠輕鬆擴展並縮短開發時間。
.NET Core和.NET Standard Library創建了一個通用平臺。過去,當新版本的操做系統或新設備出現時,開發人員有責任從新構建新平臺的應用程序或庫,並分發更新。使用.NET Core,不須要重建和從新分配。只要新的平臺支持你全部的依賴庫,它就支持你的應用程序。
Microsoft產品每每具備複雜的安裝過程。COM組件,註冊表項,特殊文件夾,GAC - 都是爲了利用Windows的特性而設計的。.NET框架依賴於這些構造,這使得它不適合其餘操做系統。
在發佈依賴於.NET Framework的應用程序時,安裝程 序必須足夠聰明才能檢測是否安裝了錯誤的.NET Framework版本,併爲用戶提供正確的方法。大多數現代Windows版本都包含.NET Framework。這使得某些應用程序更容易安裝,可是若是應用程序使用默認狀況下未安裝的功能(如ASP.NET與IIS或WCF組件的集成),則可能會致使複雜的問題。
另外一個複雜的問題來自補丁。包括錯誤修復或安全更新的修補程序能夠經過Windows更新或經過Microsoft下載中心分發給客戶。您測試應用程序的.NET Framework可能與客戶使用的補丁程序不一樣。當您假定.NET Framework對於全部客戶都是同樣的時候,一般很難肯定在應用程序中致使奇怪行爲的緣由。
.NET Core的模塊化設計意味着您只包含所需的依賴關係。全部這些依賴關係與您的應用程序進入相同的文件夾。部署應用程序與複製文件夾同樣簡單。這種方法的另外一個優勢是能夠有多個版本並行運行。這個策略對於使全部平臺的部署體驗保持一致相當重要。
在雲系統中,用更少的硬件爲更高密度的用戶提供服務是很是重要的。應用程序的佔位面積越小,密度越高。虛擬機已經在雲端廣泛存在多年,可是它們有幾個問題:
容器經過虛擬化操做系統來解決虛擬機的問題。容器只包含應用程序及其依賴項。文件大小要小不少倍,啓動時間以秒爲單位,只有應用程序加載到內存中,容器保證在任何主機上工做。
內置於Windows的.NET Framework不能在容器上運行。鑑於容器的明顯優點,.NET Core的設計決定之一就是使其成爲模塊化。這意味着你的.NETCore應用程序能夠被「發佈」,使得它和它的全部依賴關係在一個地方,這很容易放入容器。
若是您不熟悉ASP.NET,則是.NET Framework中內置的Web應用程序平臺。ASP.NET被許多有影響力的組織所使用,包括Stack Overflow還有絕大多數的可靠性很高的金融證券行業領域。ASP.NET是2002年發佈的第一個.NET Framework版本,並不斷髮展。儘管ASP.NET取得了成功,但在ASP.NET團隊中卻感受到他們正在失去開發人員,由於ASP.NET的性能沒有競爭力,只能在Windows平臺上運行。
一家名爲TechEmpower的公司每隔幾個月就會運行一次Web應用程序平臺的基準測試,並提供一個分爲幾類的排名。基準測試在Linux上運行,僅包含Windows平臺。對於ASP.NET團隊來講,這很麻煩。許多平臺都用於編寫跨平臺的Web應用程序,而且其性能數據使人印象深入。此外,一些Java框架發佈了天文數字,例如每秒570萬個明文請求,或者490萬個。
圖3 TechEmpower基準,第12輪
在TechEmpower基準測試的第十一輪中,Mono平臺上的ASP.NET MVC被歸入測試。結果很差。Mono上的ASP.NET每秒產生一個微小的2000個明文請求。Mono不是由Microsoft建立的,它不會像普通的.NET Framework那樣獲得相同數量的性能調整。爲了得到更公平的比較,ASP.NET團隊決定在與TechEmpower相同的硬件上運行.NET 4.6的基準測試。結果是每秒約50,000個請求。仍然沒有接近NodeJS(每秒320,000個請求),或TechEmpower列表上的其餘任何頂級框架。
可憐的低分並不意外。如前所述,ASP.NET知道改變現狀只能經過重寫整個架構來清除障礙。這正是發生的事情。
ASP.NET團隊着手構建ASP.NET Core,幾個月後,該團隊慶祝asp.net core每秒超過100萬個請求。最新asp.netcore與node.js的性能對比更是讓asp.net core的性能優點繼續擴大
上圖中可看出asp.net core做爲複雜web開發的性能已經相較於以前有質的提升, ASP.NET Core VS node.js
ASP.NET Core代表了微軟思惟的轉變。微軟意識到它必須具備競爭力才能贏得開發者。它還必須在Windows之外的平臺上競爭。這是建立.NET Core的原動力。
現代軟件開發人員並不知足於尋求功能。當已經有一個知足他們需求的開源項目的時候,尤爲如此。當大公司熱衷於開源軟件時,即便是最忠實的微軟開發者也會轉向其餘框架和庫,以便在預算內按時完成本身的項目。若是微軟關心「開發人員,他們必須作出改變。
公開.NET Framework的源代碼是第一步。.NET Framework源代碼已經在referencesource.microsoft.com 和GitHub上公開了好幾年了。
圖4 .NET Framework參考源
從單獨的開源代碼到接受外來的貢獻是徹底不一樣的。.NET Core開發人員不只但願得到外部貢獻,還但願將社區歸入設計和開發。這致使了更多的透明度。ASP.NET Core團隊每週都會在http://live.asp.net上舉行一次社區直播會議。.NET Core的代碼從一開始就在GitHub上公開,任何人均可以提出請求。社區成員能夠在GitHub中建立錯誤和功能。.NET Core已經標誌着微軟在開源方面的重大轉變。
.NET Core不只是Linux和Mac的.NET Framework。微軟並無移植全部的.NET Framework,對於ASP.NET客戶來講,ASP.NET團隊是.NET Core的驅動因素。MVC,Web API和SignalR均可以在.NET Core中找到,或者在路線圖上。
我給這個列表提供了能夠改變的知識。某些功能不適用於非Windows平臺,其餘某些功能也將不會由Microsoft在未來推出,由於有更好的替換或功能在某些方面有問題(不安全,難以維護等 )。
有經驗的.NET Framework開發人員可能會在.NET Core中遇到一些驚喜。編寫新的代碼應該是相對直接的,由於你不太可能使用像HashTable
or 這樣的舊的結構ArrayList
。Visual Studio的Intellisense也指出.NET Core是否支持類型,方法,屬性等。
圖5 Visual Studio IntelliSense指示.NET Core中是否有類或成員可用
。NET可移植性分析器
若是您試圖將現有的.NET應用程序轉換爲.NET Core,那麼最好的地方就是.NET可移植性分析器。它既能夠做爲命令行應用程序,也能夠做爲Visual Studio插件使用。有許多.NET平臺可供選擇:
圖6 .NET可移植性分析器中提供的目標平臺
儘量使用此工具建立一個詳細的報告,提供有用的建議:
圖7。.NET可移植性分析器報告
反射
.NET Core中的反射工做方式與.NET Framework中的不一樣。最明顯的區別是,Type類
上正常的許多操做再也不存在。有些人已經被調到一個新的TypeInfo類
。其餘操做在.NET標準庫中不可用,而且須要額外的依賴性。
.NET Framework實現反射
.NET Framework實現反射 PropertyInfo targetProperty = null; foreach (var property in owningElement.GetType().GetProperties()) { if (property.Name == this.Name && property.PropertyType.IsGenericType) {
The .NET Core 實現反射.
PropertyInfo targetProperty = null; foreach (var property in owningElement.GetType().GetProperties()) { if (property.Name == this.Name && property.PropertyType .GetTypeInfo().IsGenericType) {
❶須要依賴於System.Reflection.TypeExtensions
❷ 許多類型操做移到了TypeInfo
軟件開發行業正在不斷髮展。從語言到框架,工具到方法論,一切都受到挑戰和改進。.NET框架已經到了不起不作出改變的時候,以跟上競爭對手。.NETCore是.NET演進過程當中必不可少的一步。它將最好的.NET Framework與現代軟件開發中使用的實踐相結合。諸如可移植性,簡單部署,高性能,開放源代碼和強大支持等特性使其值得一試。
以上數據是.NETCore2.0數據,最新穩定版本是2.1.300,性能在2.0基礎上又大幅提高,具體詳情請Google
推薦免費高質量微服務書籍:.NET微服務 容器化.NET應用架構指南
.NET Core介紹 (PDF) https://files.cnblogs.com/files/xiaoliangge/NETCore-chaunce.pdf(可用於公司.netcore分享ppt使用)