asp.net 5是下一代的asp.net,該版本進行了全部重寫以適用于跨平臺,新新版本中,微軟引入了如下工具與命令:DNVM、DNX、DNU。
DNVM(.NET Version Manager):由于要實現跨平臺的目錄,微軟提供了DNVM功能,DNVM是ASP.NET最底層的內容,他是一組Powershell腳本,用于啟動指定版本的ASP.NET運行環境,并且可以在同一臺機器的同一時間點上通過使用Nuget工具來管理各種版本的ASP.NET運行環境(DNX),以及進行相應的升級操作。
DNX(.NET Execution Environment):DNX是ASP.NET程序的運行環境,用于啟動并運行ASP.NET程序。該運行環境包括了編譯系統、SDK工具集、Native CLR宿主環境。可以使用DNVM管理各種版本的DNX,如dnvm list命令可以列出所有可用的DNX環境,而dnvm install 0.1-alpha-build-0446則可以將指定版本的DNX安裝到.dnx文件夾,你可以在%USERPROFILE%/.dnx/runtimes 目錄下找到已安裝所有版本的DNX。不同的操作系統有不同的DNX版本。
dnx.exe:dnx.exe是用于啟動自宿主環境(Self-Hosting)的命令行工具,在使用命令行代碼進行自宿主環境啟動程序時,dnx負責查找并調用CLR Native Host,dnx命令是整個運行環境的入口點,你可以使用dnx run來啟動程序。
dnu(DNX Utility):是一個命令行的包管理器,包含在DNX內,所以只要安裝了DNX,就可以使用dnu命令, 其可以用于恢復程序包、安裝程序包、部署程序包等等,比如把project.json里自定義的程序集自動下載下來進行使用。
DNX是ASP.NET程序運行的核心,其遵循如下兩個準則:
DNX執行環境的分層架構如下:

該層的功能非常簡單,主要就是用于查找并調用Layer 1里的CLR Native Host,并將系統相關的參數傳遞給native host,以便后續使用。目前Windows下使用DNX.exe來處理這個事情,而IIS也提供了一個中介(網站bin目錄下提供一個AspNet.Loader.dll)可以將請求轉發給Native Host;而linux和Mac則通過其相應版本的dnx來支持這項功能。
DNX用法:
dnx.exe --lib {paths} --appbase {path} [ProgramName]--lib {paths}:程序集dll的保存地址(一般是引用的第三方程序集和項目預編譯程序集),該地址是Layer 2層的托管代碼入口點可以加載程序集的地方。
--appbase {path}:程序保存的目錄,默認為%CD%。
[ProgramName]:程序名稱,該程序所在的程序集(或者是含有Programe::Main的dll)保存在--lib 路徑下,默認值是appbase/project.json里的name。大多數情況下,該名稱都是包含著加載鏈的程序宿主(Microsoft.Net.applicationHost)。但是,如果你的程序包含了入口點(Main方法),并被編譯到--lib目錄下的話,你就可以使用該程序集的名稱作為[ProgramName],這種方式將完全忽略加載鏈并直接啟動你的程序。
這一層的內容依賴于你所選擇呢CLR版本,該層有如下兩個職責:
Core CLR,該層會加載coreclr.dll,配置并啟動運行環境,然后創建應用程序域(AppDomain),以便運行所有的托管代碼。Layer 2),一旦Native Host的入口點返回了該線程,就會把CLR的線程清理干凈并關閉,比如,卸載應用程序域(AppDomain)并停止運行環境。Layer 2層(托管代碼入口)是編寫托管代碼的第一層,其職責如下:
LoaderContainer(其包含需要的ILoaders),ILoader負責根據程序集的名稱來加載程序集。CLR需要一個程序集的話,LoaderContainer就會使用其ILoader來解析所需要的程序集。--lib的路徑目錄下,用根ILoader來加載程序集,并解析其依賴。如果開發人員將整個程序編譯成程序集放在libpath目錄下,那該層就是你的應用程序了。使用的時候,將含有程序入口點的程序集名稱作為[ProgramName]的參數傳入即可,Layer 2層會直接調用該程序集。
不過,一般其它情況下,都會使用一個應用程序宿主(Application host)來解析程序的依賴內容并啟動運行程序。Microsoft.Net.ApplicationHost是運行環境提供的應用程序宿主,并擁有如下職責:
project.json里定義的各種依賴程序集。ILoader添加到LoaderContainer,以便從各種地方(如源代碼、NuGet、Roslyn等)加載相應的程序集。這一層,就是開發人員開發的程序,其運行在應用程序宿主之上。
要對ASP.NET 5程序的運行環境DNX進行配置,首先需要安裝并配置DNVM,不同的操作系統安裝DNVM的時候不太一樣,我們在這里大概講解一下。
Windows安裝命令:
//需要安裝powershell 3.0@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/master/dnvminstall.ps1'))"Linux:
curl -sSL https://raw.githubusercontent.com/aspnet/Home/master/dnvminstall.sh | sh && source ~/.dnx/dnvm/dnvm.shMac OS X:在Mac上,首先要安裝Mac系統本身的包管理器Homebrew(http://brew.sh),并使用brew tap aspnet/k命令將指定到ASP.NET5相關的git存儲庫,比如執行如下命令:
brew install dnvm該命令將會自動從ttps://www.nuget.org/api/v2上下載最新的DNX,下載以后,如果你的系統不識別dnvm的話,你還需要再執行一下如下語句:
source dnvm.sh上述DNVM安裝以后,系統會將dnvm文件復制到C:/Program Files/Microsoft DNX/Dnvm目錄,并將C:/Program Files/Microsoft DNX/Dnvm目錄添加到環境變量中,以便全局都可以使用。注意:這里只是安裝了DNVM,并沒有安裝任何版本的DNX,要安裝DNX的話,可以通過運行dnvm或dnvm help來查找相關的命令,具體命令如下:
dnvm upgrade [-x86][-x64] [-svr50][-svrc50] [-g|-global] [-proxy <ADDRESS>]dnvm install <semver>|<alias>|<nupkg>|latest [-x86][-x64] [-svr50][-svrc50] [-a|-alias <alias>] [-g|-global] [-f|-force]dnvm use <semver>|<alias>|none [-x86][-x64] [-svr50][-svrc50] [-p|-persistent] [-g|-global]dnvm list //列出所有已安裝的DNX版本dnvm alias //列出所有定義了別名的DNX版本dnvm alias <alias> // 顯示定義了別名的DNX名稱dnvm alias <alias> <semver> [-x86][-x64] [-svr50][-svrc50] //給指定的DNX版本設置別名通過dnu命令進行包管理的時候,通常使用如下命令:
dnu restore:查詢程序的所有依賴包,并將其全部下載到packages目錄,該命令會下載整個依賴包以及這些依賴包所依賴的其它依賴包。dun install <package id>:該install命令用于下載指定的程序包并添加到程序中。dun publish:該命令會將你的程序打包到一個可以運行的自包含目錄中。其會創建如下目錄結構:
output/ output/packages outpot/appName output/commandName.cmdpackages目錄包含所有應用程序需要的程序包。appName目錄包含所有應用程序的代碼,如果引用了其它項目,則在引用的其它項目也會創建各自項目的同級目錄,即生成的目錄會和AppName同級。publish命令,會將project.json中的commands節點中的各種命令,分別生成響應的命令行文件,如commands里的web命令,我們就可以通過dnx web(格式:dnx <command>)開運行它。由于dnu在內部使用了Nuget命令,進行程序包的管理,所以使用的時候要正確配置Nuget的feed源,目前ASP.NET 5相關的包都在myget feed上,所以我們需要添加這個feed才能正常運行。這些配置信息在Windows下的%AppData%/NuGet/NuGet.config(或者*nix下Mono使用的~/.config/NuGet/NuGet.config)文件中進行管理。示例如下:
<?xml version="1.0" encoding="utf-8"?><configuration> <packageSources> <add key="AspNetVNext" value="https://www.myget.org/F/aspnetvnext/api/v2/" /> <add key="nuget.org" value="https://www.nuget.org/api/v2/" /> </packageSources> <disabledPackageSources /> <activePackageSource> <add key="nuget.org" value="https://www.nuget.org/api/v2/" /> </activePackageSource></configuration>在VS2015下,則可以直接通過Tools--> Options--> Nuget Package Manager--> Package Sources來設置,示例如下圖:
另外需要注意一下,上述feed的地址是asp.net5的每日構建版本,如果你想使用穩定的里程碑版(如1.0.0_alpha4),則需要使用如下地址
https://www.myget.org/F/aspnetmaster/api/v2/。
新聞熱點
疑難解答