歡迎光臨
每天分享高質量文章

.NET專案遷移到.NET Core操作指南

  這篇文章,彙集了大量優秀作者寫的關於”.NET遷移到.NET Core”資料文章以及微軟官方教程文件。是我在遷移公司框架專案到.NET Core.NET Standard時遇到的問題,並將相關資料整理成這篇文章。記錄如何一步一步把專案遷移到.NET Core。

在此感謝這些革命前輩,填平的坑,走出的路……

.NET Core提供的特性

  1. 1.開源、免費

  2. 2.輕量級、跨平臺

  3. 3.組件化、模塊化、IOC+Nuget、中間件

  4. 4.高性能

  5. 5.統一了MVCWebAPI編程模型

  6. a) 比如:ASP.NET Core MVC Web API 直接或間接繼承同一個基類 ControllerBase,提供可使用的API也一致化

  7. b) 比如:舊ASP.NET時代,寫全域性filter需要針對MVC Web API 分別編寫代碼,但在ASP.NET Core,直接使用一套中間件代碼即可

  8. 6.可測試性

  9. 7.微服務、容器化支持

  10. 8.標準化 .NET API 規範– .NET STANDARD,整體架構如下圖:

.NET Core性能提升

  1. 1.TechEmpower機構

  TechEmpower機構會定期對各語言主流的web框架做性能測試

  https://www.techempower.com/benchmarks/

  1. 2.博客園博主、微軟MVP – 楊曉東,做的 “Hello World”性能測試

  2. ASP.NET Core 1.1性能對比評測(ASP.NET,Python,Java,NodeJS)

編號

對比方

系統環境

宿主環境

測試結果(QPS

1

ASP.NET Core vsASP.NET Core

Windows

Kestrel vs IIS

45.6k vs 15.2k

2

ASP.NET Core vsASP.NET

Windows

IIS vs IIS

15.2k vs 18.2k

3

ASP.NET Core vsASP.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 vsNodeJS Express

Linux

Kestrel vs self host

26.7k vs 15.6k

6-2

ASP.NET Core vsNodeJS 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)的性能對比測試

遷移工作量評估(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. 1.如何組織一個同時面向多標的框架的 C# 專案解決方案

  2. 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)之間取用關係

  1. 3.專案支持多標的框架

支持多標的框架,並解決第三方庫取用差異的問題(在 csproj 檔案中指定包含條件)

標的框架名稱串列 (命名全小寫)

如何除錯多標的框架類庫?

NET Standard/Core專案使用條件判斷輸出多版本xml註釋文件

  1. 4.多標的框架中共享代碼方案

1、【首選】.NET Standard,需要標的SDK支持對應的 .NET Standard 版本。

2、共享專案。直接共享了原始碼,只要在標的專案中指定了條件編譯符,那麼原始碼便能針對各種不同的標的框架進行分別編譯。

3、[add as link]使用鏈接共享 Visual Studio 中的代碼檔案

  1. 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. 1.自動生成AssemblyInfo的原理

  2. 2.解決方案:不自動創建 AssemblyInfo 檔案

  3. ASP.NET Core開發之HttpContext

.net core 使用JsonConvert替代JavaScriptSerializer

ASP.NET Core 中重覆讀取 Request.Body 的正確姿勢

JsonRequestBehaviorcore中被移除的問題

  1. 1.[ASP.NET MVC]解決”若要允許 GET請求,請將 JsonRequestBehavior 設置為AllowGet”

  2. 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同意和非必要cookieGDPR功能引起。(GDPR,即General Data Protection Regulation,《通用資料保護條例》)

ASP.NET4.5ASP.NET Core中共享cookies認證信息(加解密方式不一致問題)

   .NET跨平臺之旅:ASP.NET Core從傳統ASP.NET的Cookie中讀取用戶登錄信息

   開源方案:[git]idunno.CookieSharing

ASP.NET Core如何獲取客戶端IP地址(被移除的ServerVariables物件)

ASP.NET Core中 BuildManager.GetReferencedAssembiles() 的替代方案

1AppDomain.CurrentDomain.GetAssemblies()

2https://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知識點文章,方便大家學習和知識查找。

赞(0)

分享創造快樂