中文不知如何定義標題,所以干脆就直接貼出關鍵字,在 ASP.NET 5 項目的 project.json 配置文件中,會有這樣的定義:
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
frameworks 配置的是什么東西?dnx451 和 dnxcore50 又是什么鬼?
可能了解過 ASP.NET 5 的童鞋會知道,但如果再深入一些,就必須搞清楚 ASP.NET 5 相關內容的來龍去脈,幸好幾個月之前,我寫過幾篇類似的博文,不過現在已經忘的差不多了,而且 ASP.NET 5 的變化也非常大,現在又重讀了之前寫的博文,然后又 Google 了一下資料,回憶的差不多了,再記錄一遍。
之前的相關博文:
- 魅力 .NET:從 Mono、.NET Core 說起
- .NET Core 和 .NET Framework 之間的關系
- Microsoft Build 2015 匯總
- K & DN 的前世今生(微軟開源命名變革)
首先,再明確下 .NET Core 和 .NET Framework 之間的關系?我們之前開發 ASP.NET 應用程序,微軟更新它,然后我們應用程序跟著更新,1.0->2.0->3.0->4.0->4.5->…,應用程序還是照樣跑,所以我們一般不太關心 .NET Framework 到底是什么鬼?但現在微軟搞了 ASP.NET 5,開發方式和之前有很大的不同,比如上面的配置代碼,你就需要搞清楚到底是什么東西?.NET Core 和 .NET Framework 的關系,之前的博文中我說過是子集關系,其實現在看來也不是完全正確,.NET Core 應該是全新的一個 .NET Framework 實現,關系的話,應該是平級。
.NET Core 包含:
- 運行時庫:.NET Core Runtime(coreclr、dnx)
- 基礎類庫:.NET Core Framework(corefx)
我們一般說的 .NET Framework 是基礎類庫,也就是項目中引用的程序集,其實這并不準確,它應該還包含運行時庫,.NET Framework 是一個大的概念,微軟更新 .NET Framework 4.5.1,其實并不只是更新基礎類庫,還有運行時的一些東西,比如編譯器等等,不過我們開發者直接感受到的是基礎類庫的變化,所以概念中的理解會有些偏差。
下面兩張圖可以更好的理解。
從第一張圖中可以看到,.NET Framework 4.6 包含了一大堆東西(重要的是最后一條),倒第二條中說 ASP.NET 5 可以運行在 .NET Framework 4.6 上,這是什么意思呢?ASP.NET 5 可以運行在 .NET Core 上,又可以運行在 Framework 4.6 上,也就是 project.json 配置文件中的 frameworks 配置,ASP.NET 5 和 .NET Core 并不是一一對應,脫離了 .NET Core,ASP.NET 5 照樣可以運行,只不過和一般 ASP.NET 應用程序沒什么區別,比如不能跨平臺,但如果反過來就不行了,比如基于 .NET Framework 4.6 的一般 ASP.NET 應用程序就不能運行在 .NET Core 上,為什么?因為之前的 ASP.NET 都是基于 .NET Framework 設計的,并沒有兼容 .NET Core。
第二張圖很好的說明了 .NET Core 和 .NET Framework 之前的關系,注意 .NET Framework 4.6 下面注釋中的 for windows 字眼,后面有這樣一個詞 Desktop CLR,其實說的就是 .NET Framework CLR,或者稱之為 Windows .NET CLR,.NET Core 5 圖中包含 CoreCLR 和 .NET Native,其實 .NET Native 也是 CoreCLR 的一種,稱之為代碼即時編譯(不經過中間語言,直接將程序代碼編程成機器語言),注釋中的 .NET libraries 和 runtimes,其實就是我們上面所說 .NET Core 的兩點內容。
再來說下運行時庫是什么鬼?ASP.NET 5 的運行時就是 DNX
The DNX (a .NET Execution Environment) contains the code required to bootstrap and run an application, including the compilation system, SDK tools, and the native CLR hosts.
DNX 主要包含編譯器、SDK 工具、即時編譯運行時(上面說到的 .NET Native),運行 ASP.NET 5 應用程序命令 dnx kestrel
,其實就是 SDK tools 的一種,它的作用就是將 ASP.NET 5 應用程序運行在 DNX 上,有點像 IIS 站點中的啟動/停止。
好了,了解了這么多。我們再來看 project.json 中的 frameworks 配置,它的作用就是配置 ASP.NET 5 應用程序運行在哪個環境中?這里說的環境并不只包含運行時,還有基于的基礎類庫。
看一下 frameworks 配置選項:
dnxcore50
DNX SDK running on CoreCLR/CoreFxdnx451
DNX SDK running on .Net 4.5.1 (Desktop CLR / Full BCL and FCL)net46
.Net Framework SDK running on .Net 4.6 (Desktop CLR / Full BCL and FCL).uap10.0
UWP SDK running on .Net Native/CoreFxdotnet
any pure IL code which declares its dependencies (instead of a PCL contract). Framework dependencies are available for .Net 4.6, DNX or UWP.
因為我們是 ASP.NET 開發,所以常用的是 dnx451 和 dnxcore50,簡單總結:
dnx*
The Dotnet Runtime Environment for the .NET Frameworkdnxcore*
The Dotnet Runtime Environment for the .NET Core CLR
*
代表版本號,微軟以后可能會進行更新升級,結合之前的說明,再看上面的定義,其實就非常好理解了,說白了,dnx*
只適用于 windows,dnxcore*
適用于跨平臺,就這么簡單。
一張非常詳細的圖:
另外,frameworks 還有另外一種作用,就是對運行的每一種環境進行單獨配置,我們最常配置的,dnx451 和 dnxcore50 兩種環境都引用同一個程序集,配置代碼:
"dependencies": {
"library1": "1.0.0"
},
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
如果 dnx451 引用 library1,dnxcore50 不引用,那改如何配置呢?配置代碼:
"dependencies": {
},
"frameworks": {
"dnx451": {
"dependencies": {
"library1": "1.0.0"
}
},
"dnxcore50": { }
}
如果 dnx451 和 dnxcore50 都引用 library1,但是 library1 需要編寫不同的代碼,該如何操作?答案如下:
#if DNX451
//Code here for dnx451
#elif DNXCORE50
//code here for dnxcore50
#endif
需要注意的是,dnx451 和 dnxcore50 都可以引用 ASP.NET 5 類庫項目,但對于非 ASP.NET 5 類庫項目,dnx451 可以引用(有警告),dnxcore50 則不可以引用。
參考資料:
- Project.json file
- Introducing .NET Core
- Announcing NuGet 3.1 with Support for Universal Windows Platform
- Demystifying PCL’s, .NET Core, DNX and UWP
- What frameworks are available in ASP.NET 5 applications?
- Target framework dnx451 or net451 in class library projects
- Project.json definition dnx451 vs .dotnet ( 4.51)
文章列表