.NET項目遷移到.NET Core操做指南

 

爲何要從.NET遷移到.NET Core... 1html

     .NET Core提供的特性... 1git

     .NET Core性能提高... 2github

.NET如何遷移到.NET Core... 4web

      遷移工做量評估(API兼容性分析)... 4編程

      遷移方案制定... 4json

      經過類名、命名空間,查詢API的實現信息... 4windows

      類庫項目、應用項目如何選擇框架類型... 5api

      遷移到.NET Core,但只運行在windows平臺上... 6cookie

      兼容.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.免費和最寬鬆的開源協議

  .NET Core從屬於.NET基金會,由微軟進行官方支持。使用最寬鬆的MIT和Apache 2開源協議,文檔協議遵循CC-BY。這將容許任何人任何組織和企業任意處置,包括使用,複製,修改,合併,發表,分發,再受權,或者銷售。惟一的限制是,軟件中必須包含上述版權和許可提示,後者協議將會除了爲用戶提供版權許可以外,還有專利許可,而且受權是免費,無排他性的(任何我的和企業都能得到受權)而且永久不可撤銷,用戶使用.NET Core徹底不用擔憂收費問題,你能夠很自由的部署在任何地方.

2.輕量級、跨平臺

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

4.高性能

5.統一了MVCWebAPI編程模型

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

b) 好比:舊ASP.NET時代,寫全局filter須要針對MVC Web API 分別編寫代碼,但在ASP.NET Core,直接使用一套中間件代碼便可

6.可測試性

7.微服務、容器化支持

8.標準化 .NET API 規範- .NET STANDARD,總體架構以下圖:

clip_image002[4]

 

.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

clip_image003[4]

性能測試工具:

    微軟出品: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

clip_image005[4]

 

遷移方案制定

微軟官方《組織項目以支持 .NET Framework 和 .NET Core》文章中,有介紹兩種遷移方案:

方案1、將現有項目和 .NET Core 項目合併爲單個項目(多目標框架)

方案2、將現有項目和新的 .NET Core 項目分離(拷貝到新項目)

   

經過類名、命名空間,查詢API的實現信息

遷移過程當中,有類庫命名空間被調整,nuget歸屬包被調整,具體類庫在.NET Core哪一個版本中被實現也不是很清楚,經過下面兩個查詢助手,便可解決這些問題。

一、查詢命名空間、類庫在哪一個nuget package包中定義(第一次查詢比較慢)

二、查詢 NET API 在各版本中實現

結果圖以下:

 

類庫項目、應用項目如何選擇框架類型

1.如何組織一個同時面向多目標框架的 C# 項目解決方案

2..NetStandard;.netCore;FX(.NetFrameWork)之間引用關係

.NET Standard 2.0中,咱們使在 .NET Standard 庫中經過一個兼容層去引用已有的 .NET Framework 的庫成爲可能。固然,這隻對那些只使用了適用於 .NET Standard API .NET Framework 庫有效。

clip_image006[4]

FX引用.NetCore:不經過

.NetStandard引用.NetCore:不經過

 

.NetCore引用FX:經過

.NetCore引用.NetStandard:經過

.NetStandard引用FX:經過

FX引用.NetStandard:經過

 

       ASP.NET Core能夠在「.NET Framework 和 .NET Core」上運行,但ASP.NET Core 3.0 以及更高版本只能在 .NET Core 中運行

具體參見:

  【譯】介紹 .NET Standard -- 【原文】

  關於.net core 和 .net fx相互引用的問題

.NetStandard;.netCore;FX(.NetFrameWork)之間引用關係

3.項目支持多目標框架

支持多目標框架,並解決第三方庫引用差別的問題(在 csproj 文件中指定包含條件)

目標框架名稱列表 (命名全小寫)

如何調試多目標框架類庫?

NET Standard/Core項目使用條件判斷輸出多版本xml註釋文檔

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

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

二、共享項目。直接共享了源碼,只要在目標項目中指定了條件編譯符,那麼源碼便能針對各類不一樣的目標框架進行分別編譯。

三、[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 的正確姿式

JsonRequestBehaviorcore中被移除的問題

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贊成和非必要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對象)

如何獲取項目依賴的全部程序集

   方案一:AppDomain.CurrentDomain.GetAssemblies(),此辦法不能獲取到全部依賴的程序集,由於.Net有延遲加載程序集機制

   方案二:適用於傳統ASP.NET項目,System.Web.Compilation.BuildManager.GetReferencedAssemblies();

   方案三:適用於ASP.NET Core項目,DependencyContext.Default.CompileLibraries,具體代碼參考下面

var dlls = DependencyContext.Default.CompileLibraries
            .SelectMany(x => x.ResolveReferencePaths())
            .Distinct()
            .Where(x => x.Contains(Directory.GetCurrentDirectory()))
            .ToList();
        foreach (var item in dlls)
        {
            try
            {
                AssemblyLoadContext.Default.LoadFromAssemblyPath(item);
            }
            catch (System.IO.FileLoadException loadEx)
            {
            } // The Assembly has already been loaded.
            catch (BadImageFormatException imgEx)
            {
            } // If a BadImageFormatException exception is thrown, the file is not an assembly.
            catch (Exception ex)
            {
            }
        }

參考:

        AppDomain.CurrentDomain.GetAssemblies()

        Is there an alternative for BuildManager.GetReferencedAssemblies() in ASP.NET Core?

 

.NET Core 2.0遷移System.Runtime.Caching

.NET Core 2.0升級到3.0實戰方案

  從.NET CORE2.2升級到3.0過程及遇到的一些問題

 

遷移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 版本升級遷移系列

 

 

推薦閱讀:

  .NET Core 學習資料精選:入門

  .NET Core 學習資料精選:進階
  

==============================================================================

over,謝謝查閱,以爲文章對你有收穫,請多幫推薦。歡迎提供更好的資料信息。

 

 

 

原文出處:https://www.cnblogs.com/heyuquan/p/dotnet-migration-to-dotnetcore.html

相關文章
相關標籤/搜索