日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dotnet core TargetFramework 解析顺序探索

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dotnet core TargetFramework 解析顺序探索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

dotnet core TargetFramework 解析順序測試

Intro

現在 dotnet 的 TargetFramework 越來越多,拋開 .NET Framework 不談,如果一個類庫支持多個 TargetFramework 應用實際運行的時候會使用哪個版本的 API 呢,之前一直都是想當然的自以為是了,于是想測試一下實際解析是怎么樣的,來看下面的示例吧

Sample

Library Sample

首先來看類庫示例項目:

項目文件如下:

類庫提供了多個 TargetFramework 的支持:

  • netstandard2.0

  • netcoreapp2.1

  • netstandard2.1

  • netcoreapp3.1

  • net5.0

  • net6.0

<Project?Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>netstandard2.0;netcoreapp2.1;netstandard2.1;netcoreapp3.1;net5.0;net6.0</TargetFrameworks></PropertyGroup> </Project>

類庫里只提供了一個類,只有一個用于測試的方法,方法實現如下:

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 下返回不同的值以測試實際執行的代碼

Executable Sample

接著看一個可執行的 Console 應用,項目文件示例如下:

Console 應用支持的 TargetFramework 如下:

  • netcoreapp2.0

  • netcoreapp2.1

  • netcoreapp3.0

  • netcoreapp3.1

  • net5.0

  • net6.0

<Project?Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFrameworks>netcoreapp2.0;netcoreapp2.1;netcoreapp3.0;netcoreapp3.1;net5.0;net6.0</TargetFrameworks><NoWarn>;NETSDK1138</NoWarn></PropertyGroup><ItemGroup><ProjectReference?Include="..\TestClassLibrary\TestClassLibrary.csproj"?/></ItemGroup></Project>

因為 netcoreapp2.0 和 .netcoreapp3.0 已經不再支持,如果直接使用會得到一個 Warning:

EOL-warning

所以在項目文件中配置了 <NoWarn>;NETSDK1138</NoWarn> 來忽略這個警告

測試代碼很簡單,直接調用類庫示例中的測試方法:

Console.WriteLine(Test.GetResult());Console.WriteLine("Hello?World!"); Console.ReadLine();

Test Output

接著我們就來測試吧,先思考一下吧,不同的 TargetFramework 輸出的結果分別是什么呢?

net6.0

net6.0

net5.0

net5.0

netcoreapp3.1

netcoreapp3.1

netcoreapp3.0

netcoreapp3.0

netcoreapp2.1

netcoreapp2.1

netcoreapp2.0

netcoreapp2.0

More

從上面的測試結果其實就能夠大概看出來,多個 TargetFramework 的解析順序,可執行應用程序首先會匹配與當前運行的 TargetFramework 相符的框架,如果沒有與當前運行的 TargetFramework 相符的框架,則會fallback 到低版本的 .NET 框架上,優先選擇高版本的框架,如果當前運行的框架版本是 net6.0,但是類庫不支持 net6.0,則會使用 net5.0,如果類庫不支持 net5.0 則會使用 netcoreapp3.1以此類推。

如果既有 .NET Core 的框架支持又有 .NET Standard 的支持,則會優先使用 .NET Core 框架,沒有可用的 .NET Core 框架的話再開始看類庫支持的 .NET Standard 的支持,優先選擇當前框架支持的高版本的 .NET Standard 框架

最后擴展一下,引用單個類庫是上面這樣的,如果類庫引用了類庫,那又會如何呢

測試項目結構如下,測試項目基于 .NET6.0,引用了一個基于 netstandard2.0/netstandard2.1 的類庫項目 ClassLibrary1,而 ClassLibrary1 引用了另外一個基于netstandard2.0/netstandard2.1/netcoreapp2.1的類庫項目,測試方法和上面的差不多,測試項目調用 ClassLibrary1 中的測試方法(實際調用了 ClassLibrary2 中的測試方法)

ConsoleApp(NET6.0)

  • ClassLibrary1(netstandard2.0/netstandard2.1)

    • ClassLibrary2(netstandard2.0/netstandard2.1/netcoreapp2.1)

輸出結果如下:

從上面的結果來看,實際的解析結果運行結果都是根據最終執行到的類庫結合應用當前運行框架來決定使用哪個版本的代碼的

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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的dotnet core TargetFramework 解析顺序探索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。