vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼


    繼上次”vNext之旅(1):從概念和基礎開始”之后再次學習vNext重新遇到了弄不懂的事情,花了一些時間學習,今天來分享一下,為后人節省些時間。

起因

    在用vNext造輪子——框架的時候引入“Microsoft.Dnx.Runtime”包錯誤。錯誤如下:

image

當時就很郁悶我明明用的是最新的版本:“1.0.0-rc-final”啊,為什么會報錯,微軟改名之后沒有及時更新包嗎?

下面我打開了這個包在NuGet的地址。

image

發現確實只寫了“DNX4.5.1”和“DNXCore50”這兩個版本,我同時又打開了“Microsoft.Extensions.DependencyInjection”包的NuGet地址。

image

發現了“.NETFramework 4.5.1”、“.NETPlatform 5.4”、”.NETCore5.0”。

這時我很好奇,這兩個包同是vNext的產物,沒有原因支持的平台不一樣啊,抱着這個問題我覺得創建個ConsoleApp測試一下。

打開“project.json”發現了和類庫不一樣的地方

image

這邊的frameworks的命名完全不一樣,

在類庫中為:“net451”、“dotnet5.4”而在這里變成了“dnx451”、“dnxcore50”。

困惑又加重了,難道微軟改名之后忘記改了ConsoleApp的模板?

解惑

我試着把這幾個關鍵詞輸入google,找了了一些文章,終於解決了我的迷惑。

文章地址為:

https://github.com/aspnet/Announcements/issues/98

https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/standard-platform.md

image

從這段話中說明了為什么“ConsoleApp”和“類庫”項目框架目標不一致是正常的。。。

也給出了“ConsoleApp”、“測試項目”還是需要使用“dnx”和“dnxcore”這樣的命名,而類庫則需要使用“net”和“dotnet”這樣的命名。

也給出了遷移方案,同時也給出了編碼過程中的環境變量:

1.DNX451 => NET451

2.DNXCORE50 => DONET5_4

同時也發現,微軟覺得應用程序和測試項目該采用“dnx”和“dnxcore”命名方式的框架目標。

至此疑惑解開,但還是覺得奇怪,微軟為什么要這樣區分,當時在.NET Framework上不就沒有分這么多嗎?

深究

為什么微軟需要這么做?

抱着這樣的疑問打開第二個鏈接,發現了這一段很好的解釋了“為什么”。

image

這么做只有一個目標:可移植性。

在之前我們再用NuGet GUI工具打包的時候會發現有很多選擇(下圖)

image

而這些平台絕大數都擁有CLR,唯一變的只是應用程序端,只有這個端不一樣,那么我開發一個匯率計算算法需要每個平台單獨寫嗎?其實不需要,因為我們都運行於CLR,我們有CTS、CLS還有CLR這些東西你們去做兼容就好了,不需要開發者在糾結了,所以現在的微軟一直強調“一個平台戰略”、“一次編譯到處運行”,只把會變化的應用程序端設置框架版本,而類庫等通用的東西盡量變成全部可移植的。

下圖來自微軟:

52bc69d6-879c-11e5-8640-d92f9ee1e2d9

右邊的就屬於類庫,而左邊的被微軟定位為應用程序端的目標運行時。微軟希望現代化的類庫可以同時運行在這些端的運行時上,當然這個動作需要端的運行時配合與支持(微軟給出的CLR的標准、語言規范等)。

下圖是對應關系:

image

交流方式

QQ群:384413261(RabbitHub)

Email:majian159@live.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM