dotnet core TargetFramework 解析顺序探索
dotnet core TargetFramework 解析順序測試
Intro
現(xiàn)在 dotnet 的 TargetFramework 越來越多,拋開 .NET Framework 不談,如果一個類庫支持多個 TargetFramework 應(yīng)用實際運行的時候會使用哪個版本的 API 呢,之前一直都是想當(dāng)然的自以為是了,于是想測試一下實際解析是怎么樣的,來看下面的示例吧
Sample
Library Sample
首先來看類庫示例項目:
項目文件如下:
類庫提供了多個 TargetFramework 的支持:
netstandard2.0
netcoreapp2.1
netstandard2.1
netcoreapp3.1
net5.0
net6.0
類庫里只提供了一個類,只有一個用于測試的方法,方法實現(xiàn)如下:
public?class?Test {public?static?string?GetResult(){var?result?=?string.Empty;#if?NET6_0result?=?"NET6.0"; #elif?NET5_0result?=?"NET5.0"; #elif?NETCOREAPP3_1result?=?"NETCOREAPP3_1"; #elif?NETCOREAPP3_0result?=?"NETCOREAPP3_0"; #elif?NETCOREAPP2_1result?=?"NETCOREAPP2_1"; #elif?NETSTANDARD2_1result?=?"NETSTANDARD2_1"; #elif?NETSTANDARD2_0result?=?"NETSTANDARD2_0"; #endifreturn?result;} }通過條件編譯在不同的 TargetFramework 下返回不同的值以測試實際執(zhí)行的代碼
Executable Sample
接著看一個可執(zhí)行的 Console 應(yīng)用,項目文件示例如下:
Console 應(yīng)用支持的 TargetFramework 如下:
netcoreapp2.0
netcoreapp2.1
netcoreapp3.0
netcoreapp3.1
net5.0
net6.0
因為 netcoreapp2.0 和 .netcoreapp3.0 已經(jīng)不再支持,如果直接使用會得到一個 Warning:
EOL-warning所以在項目文件中配置了 <NoWarn>;NETSDK1138</NoWarn> 來忽略這個警告
測試代碼很簡單,直接調(diào)用類庫示例中的測試方法:
Console.WriteLine(Test.GetResult());Console.WriteLine("Hello?World!"); Console.ReadLine();Test Output
接著我們就來測試吧,先思考一下吧,不同的 TargetFramework 輸出的結(jié)果分別是什么呢?
net6.0
net6.0net5.0
net5.0netcoreapp3.1
netcoreapp3.1netcoreapp3.0
netcoreapp3.0netcoreapp2.1
netcoreapp2.1netcoreapp2.0
netcoreapp2.0More
從上面的測試結(jié)果其實就能夠大概看出來,多個 TargetFramework 的解析順序,可執(zhí)行應(yīng)用程序首先會匹配與當(dāng)前運行的 TargetFramework 相符的框架,如果沒有與當(dāng)前運行的 TargetFramework 相符的框架,則會fallback 到低版本的 .NET 框架上,優(yōu)先選擇高版本的框架,如果當(dāng)前運行的框架版本是 net6.0,但是類庫不支持 net6.0,則會使用 net5.0,如果類庫不支持 net5.0 則會使用 netcoreapp3.1以此類推。
如果既有 .NET Core 的框架支持又有 .NET Standard 的支持,則會優(yōu)先使用 .NET Core 框架,沒有可用的 .NET Core 框架的話再開始看類庫支持的 .NET Standard 的支持,優(yōu)先選擇當(dāng)前框架支持的高版本的 .NET Standard 框架
最后擴展一下,引用單個類庫是上面這樣的,如果類庫引用了類庫,那又會如何呢
測試項目結(jié)構(gòu)如下,測試項目基于 .NET6.0,引用了一個基于 netstandard2.0/netstandard2.1 的類庫項目 ClassLibrary1,而 ClassLibrary1 引用了另外一個基于netstandard2.0/netstandard2.1/netcoreapp2.1的類庫項目,測試方法和上面的差不多,測試項目調(diào)用 ClassLibrary1 中的測試方法(實際調(diào)用了 ClassLibrary2 中的測試方法)
ConsoleApp(NET6.0)
ClassLibrary1(netstandard2.0/netstandard2.1)
ClassLibrary2(netstandard2.0/netstandard2.1/netcoreapp2.1)
輸出結(jié)果如下:
從上面的結(jié)果來看,實際的解析結(jié)果運行結(jié)果都是根據(jù)最終執(zhí)行到的類庫結(jié)合應(yīng)用當(dāng)前運行框架來決定使用哪個版本的代碼的
References
https://github.com/WeihanLi/SamplesInPractice/tree/master/UnexpectedSamples
https://docs.microsoft.com/en-us/dotnet/core/tutorials/libraries#how-to-target-the-net-framework
總結(jié)
以上是生活随笔為你收集整理的dotnet core TargetFramework 解析顺序探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IdentityServer4之持久化很
- 下一篇: 93.7%的程序员!竟然都不知道Redi