.NET專案遷移到.NET Core操作指南
為什麼要從.NET遷移到.NET Core?... 1
.NET Core提供的特性... 1
.NET Core效能提升... 2
.NET如何遷移到.NET Core?... 4
遷移工作量評估(API相容性分析)... 4
遷移方案制定... 4
通過類名、名稱空間,查詢API的實現資訊... 4
類庫專案、應用專案如何選擇框架型別... 5
遷移到.NET Core,但只執行在windows平臺上... 6
相容.NET Core或.NET Standard API7
遷移EF框架... 8
修改為 ASP.NET Core 風格的應用... 8
這篇文章,彙集了大量優秀作者寫的關於".NET遷移到.NET Core"資料文章以及微軟官方教程文件。是我在遷移公司框架專案到.NET Core和.NET Standard時遇到的問題,並將相關資料整理成這篇文章。記錄如何一步一步把專案遷移到.NET Core。
在此感謝這些革命前輩,填平的坑,走出的路……
為什麼要從.NET遷移到.NET Core?
.NET Core提供的特性
1.開源、免費
2.輕量級、跨平臺
3.元件化、模組化、IOC+Nuget、中介軟體
4.高效能
5.統一了MVC和WebAPI程式設計模型
a) 比如:ASP.NET Core 中MVC 和Web API 繼承同一個基類,提供可使用的API也一致化
b) 比如:舊ASP.NET時代,寫全域性filter需要針對MVC 和Web API 分別編寫程式碼,但在ASP.NET Core,直接使用一套中介軟體程式碼即可
6.可測試性
7.微服務、容器化支援
8.標準化 .NET API 規範- .NET STANDARD,整體架構如下圖:
.NET Core效能提升
1.TechEmpower機構
TechEmpower機構會定期對各語言主流的web框架做效能測試
https://www.techempower.com/benchmarks/
2.部落格園博主、微軟MVP – 楊曉東,做的 “Hello World”效能測試
ASP.NET Core 1.1效能對比評測(ASP.NET,Python,Java,NodeJS)
編號 |
對比方 |
系統環境 |
宿主環境 |
測試結果(QPS) |
1 |
ASP.NET Core vs ASP.NET Core |
Windows |
Kestrel vs IIS |
45.6k vs 15.2k |
2 |
ASP.NET Core vs ASP.NET |
Windows |
IIS vs IIS |
15.2k vs 18.2k |
3 |
ASP.NET Core vs ASP.NET |
Windows |
Kestrel vs IIS |
45.6k vs 18.2k |
4 |
ASP.NET Core vs Python Django |
Linux |
Kestrel vs uwsgi |
26.7k vs 1.57k |
5 |
ASP.NET Core vs Java Servlet |
Linux |
Kestrel vs Tomcat |
26.7k vs 18.3k |
6-1 |
ASP.NET Core vs NodeJS Express |
Linux |
Kestrel vs self host |
26.7k vs 15.6k |
6-2 |
ASP.NET Core vs NodeJS Koa |
Linux |
Kestrel vs self host |
26.7k vs 17.5 |
效能測試工具:
微軟出品:Benchmarks
https://github.com/aspnet/benchmarks
其他閱讀:
是什麼優化讓 .NET Core 2.0效能飆升?
.NET Core 3中的效能提升(譯文)
Java(11,12) 與 .NET Core(2.2,3.0)的效能對比測試
.NET如何遷移到.NET Core?
遷移工作量評估(API相容性分析)
度量.net framework 遷移到.net core的工作量
可移植性分析工具:.NET Portability Analyzer
【Cli 版本】 【Visual Studio Extension 版本】
.NET Standard Versions
遷移方案制定
《組織專案以支援 .NET Framework 和 .NET Core》文章中,有介紹兩種遷移方案:
方案一、將現有專案和 .NET Core 專案合併為單個專案(多目標框架)
方案二、將現有專案和新的 .NET Core 專案分離(拷貝到新專案)
通過類名、名稱空間,查詢API的實現資訊
遷移過程中,有類庫名稱空間被調整,nuget歸屬包被調整,具體類庫在.NET Core哪個版本中被實現也不是很清楚,通過下面兩個查詢助手,即可解決這些問題。
1、查詢名稱空間、類庫在哪個nuget package包中定義(第一次查詢比較慢)
2、查詢 NET API 在各版本中實現
類庫專案、應用專案如何選擇框架型別
1.如何組織一個同時面向多目標框架的 C# 專案解決方案
2..NetStandard;.netCore;FX(.NetFrameWork)之間引用關係
在 .NET Standard 2.0中,我們使在 .NET Standard 庫中通過一個相容層去引用已有的 .NET Framework 的庫成為可能。當然,這隻對那些只使用了適用於 .NET Standard API 的 .NET Framework 庫有效。
FX引用.NetCore:不通過
.NetStandard引用.NetCore:不通過
.NetCore引用FX:通過
.NetCore引用.NetStandard:通過
.NetStandard引用FX:通過
FX引用.NetStandard:通過
具體參見:
【譯】介紹 .NET Standard 【原文】
關於.net core 和 .net fx相互引用的問題
.NetStandard;.netCore;FX(.NetFrameWork)之間引用關係
3.專案支援多目標框架
支援多目標框架,並解決第三方庫引用差異的問題(在 csproj 檔案中指定包含條件)
目標框架名稱列表 (命名全小寫)
如何除錯多目標框架類庫?
NET Standard/Core專案使用條件判斷輸出多版本xml註釋文件
4.多目標框架中共享程式碼方案
1、【首選】.NET Standard,需要目標SDK支援對應的 .NET Standard 版本。
2、共享專案。直接共享了原始碼,只要在目標專案中指定了條件編譯符,那麼原始碼便能針對各種不同的目標框架進行分別編譯。
3、[add as link]使用連結共享 Visual Studio 中的程式碼檔案
5.條件編譯符號 (命名全大寫)
指令: #if #elif #else #endif (||、&&、!)
因為目標框架提供的API不相同。故必要時可新增條件編譯符號以便支援不同的執行時版本。
微軟有針對各個目標框架有預定義前處理器符號,vs編譯時會自動識別到這些框架條件編譯符號。
.NET Framework 4.5 --> NET45
.NET Framework 4.6 --> NET46
.NET Framework 4.6.1 --> NET461
.NET Standard 1.0 --> NETSTANDARD1_0
.NET Standard 1.6 --> NETSTANDARD1_6
.NETCOREAPP 2.0 --> NETCOREAPP2_0
參考:
#if指令文件
如何將條件編譯符號(DefineConstants)傳遞給msbuild
遷移到.NET Core,但只執行在windows平臺上
使用 Windows 相容性包將程式碼移植到 .NET Core
如何:將 Windows 窗體桌面應用程式移植到 .NET Core
如何:將 WPF 桌面應用移植到 .NET Core
相容.NET Core或.NET Standard API
遷移HttpHandler與HttpModule到 ASP.NET Core 中介軟體
.NET CORE 2.0 踩坑記錄之ConfigurationManager
.NET Core/Standard 2.0 編譯時報“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute”錯誤
1.自動生成AssemblyInfo的原理
2.解決方案:不自動建立 AssemblyInfo 檔案
ASP.NET Core開發之HttpContext
.net core 使用JsonConvert替代JavaScriptSerializer
ASP.NET Core 中重複讀取 Request.Body 的正確姿勢
JsonRequestBehavior在core中被移除的問題
1.[ASP.NET MVC]解決"若要允許 GET請求,請將 JsonRequestBehavior 設定為AllowGet"
2.[ASP.NET Core]core中不會丟擲AllowGet異常,對於DenyGet則使用[HttpPost]代替
https://stackoverflow.com/questions/38578463/asp-net-core-the-name-jsonrequestbehavior-does-not-exist-in-the-current-cont
https://stackoverflow.com/questions/8464677/why-is-jsonrequestbehavior-needed?r=SearchResults
獲取ASP.NET Core中的Web根路徑和內容根路徑(移除的MapPath)
為什麼我的會話狀態在ASP.NET Core中不工作了?
由於ASP.NET Core 2.1中引入的Cookie同意和非必要cookie的GDPR功能引起。(GDPR,即General Data Protection Regulation,《通用資料保護條例》)
在ASP.NET4.5和ASP.NET Core中共享cookies認證資訊(加解密方式不一致問題)
https://www.cnblogs.com/cmt/p/5940796.html
https://github.com/blowdart/idunno.CookieSharing
ASP.NET Core如何獲取客戶端IP地址(被移除的ServerVariables物件)
在ASP.NET Core中 BuildManager.GetReferencedAssembiles() 的替代方案
1、AppDomain.CurrentDomain.GetAssemblies()
2、https://stackoverflow.com/questions/53989393/is-there-an-alternative-for-buildmanager-getreferencedassemblies-in-asp-net-co(可以正常注入使用,但是除錯時會報FileNotFoundException)
.NET Core 2.0遷移System.Runtime.Caching
遷移EF框架
【微軟官方】從 EF6 到 EF Core的遷移系列
【微軟官方】EF Core 版本升級遷移系列
修改為 ASP.NET Core 風格的應用
按照上面的方式修改API相容性後,框架類庫可以順利遷移到.NET Core,編譯通過,程式碼執行也正常。但是ASP.NET Core風格的應用,其寫法也是有很多變化的。具體參考下面文件:
將傳統 ASP.NET 應用遷移到 .NET Core
【微軟官方】ASP.NET 遷移到 ASP.NET Core教程系列
【微軟官方】ASP.NET Core 版本升級遷移系列
後續,我會再整理一篇 《ASP.NET Core 學習教程》 資源彙總的文章,目的是有條理的彙總大量優秀的ASP.NET Core知識點文章,方便大家學習和知識查詢。
==============================================================================
over,謝謝查閱,覺得文章對你有收穫,請多幫推薦。歡迎提供更好的資料資訊。
&n