asp.net 5的一項重要更新是它支持運行在 .NET Execution Environment上 ,簡稱DNX. 而 DNX Core 當前能支持三個操作系統Windows Ubuntu OSX, 雖然Mono在linux上對.NET支持非常好,但DNX引入了方便的包管理還是非常值得一試。java的jar包不內置版本號,可以隨便放在一起,.NET的dll包帶版本號,放到一起時很容易就出現版本號沖突的提示,一般不影響使用。
在Ubuntu Linux上配置 DNX 也非常方便,不需要到網站下載再執行的傳統.NET安裝方式,當然也沒有現代APP商店哪么方便。具體可以看官網,這里把命令行復制過來,在Ubuntu上一行行執行就可以了。
sudo sh -c 'echo "deb [arch=amd64] http://apt-mo.trafficmanager.net/repos/dotnet/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
sudo apt-get update
sudo apt-get install dotnet
執行完這幾條命令就有了一個dotnet環境,這里必須再提一下mono-complete,當你在DNX Core平臺上被哪些新庫搞暈時,別忘記還有一個Mono。這里是 DNXCore的API幫助,遇上不兼容必查,查得最多的會是Assembly名稱,DNX Core引入先進的包管理,但需要自己加載,對版本號。
前面的install dotnet,它只安裝了一些基本運行環境,所以非常快。下面開始測試。建一個空目錄 dnxcore ,進入,然后執行
dotnet init
這個目錄里面會有一個Hello World模板。傳統.NET程序只有PRogram.cs一個文件, DNX下多了一個project.json文件,這個文件用來根據需要加載包,一般需要修改的是dependencies這段,在里面加入對iBoxDB.DNX 2.6.2.16包的引用,還有FileSystem,Thread。在DNX中,像文件操作,線程類這些基本功能都在單獨的包中。
"dependencies": { "Microsoft.NETCore.Runtime": "1.0.1-beta-*", "System.IO": "4.0.11-beta-*", "System.Console": "4.0.0-beta-*", "System.Runtime": "4.0.21-beta-*", "iBoxDB.DNX": "2.6.2.16", "System.IO.FileSystem" : "4.0.1-*", "System.Threading.Thread" : "4.0.0-*", "System.Threading.Tasks.Parallel" : "4.0.0-*"}
這時確保網絡連接正常,然后執行
dotnet restore
等待它自動在線加載,最后你可能會有提示,有些基礎庫沒有找到。這是因為 Microsoft.NETCore.Runtime 這個基礎運行包版本一變化,它引用的包 Microsoft.NETCore.Runtime.CoreCLR 版本就變化,而Microsoft.NETCore.Runtime.CoreCLR包引用的包的版本也會變化,現在大量包是beta版本,經常升級,在一個正式包與Beta混合的環境下不容易設置對版本,干脆就不設置了,這幾個System.*的包默認都會加載。與傳統.NET Framework一二年發布一個新版本不同,DNXCore的包可是幾星期更新一次,活躍的幾天就更新了,對于喜歡總是引用最新版本的開發人員可能會興奮不斷。你也可以移走Microsoft.NETCore.Runtime, 自己管理基本包的版本,就不會有提示了。如下
"dependencies": { "System.Collections" : "4.0.10", "System.Reflection" : "4.0.10", "System.Reflection.Extensions" : "4.0.0", "System.Runtime.Extensions" : "4.0.10", "System.Text.Encoding" : "4.0.10", "System.Globalization" : "4.0.10", "System.Threading" : "4.0.10", "System.IO": "4.0.11-beta-*", "System.Console": "4.0.0-beta-*", "System.Runtime": "4.0.21-beta-*", "iBoxDB.DNX": "2.6.2.16", "System.IO.FileSystem" : "4.0.1-*", "System.Threading.Thread" : "4.0.0-*", "System.Threading.Tasks.Parallel" : "4.0.0-*",}
dotnet restore 并不會把一堆下載文件放到剛才新建的項目文件目錄內,而是位于用戶Home的 .dnx/packages 目錄下。iBoxDB.DNX 包目錄下有一個測試文件,執行如下命令復制到當前目錄
@ubuntu:~/dnxcore$ cp ../.dnx/packages/iBoxDB.DNX/2.6.2.16/content/iBoxDB26.cs .
打開 Program.cs 復制上兩行測試調用代碼
public class Program{ public static void Main(string[] args) { iBoxDB.LocalServer.DB.Root("/tmp/"); Console.WriteLine(iBoxDB.TestHelper.RunALL()); }}
最后執行
dotnet run
就可以看到效果了,不需要執行編譯。不想一行行代碼鍵入,可以在這里下載測試代碼。 dnxcore5 操作與使用在Windows 與 Ubuntu是一樣的,也就是在Windows下也是敲命令行,性能哪個好,你猜?好代碼當然都放在Windows版本下,這里再次提一下Mono。DNX能根據實際用戶情況選擇部署平臺,自動加載關聯包,這些都是不錯的特性,但如果更關心性能,當前Mono運行.NET的性能更好。
下面是使用Mono操作的對比。
編譯文件
mcs /r:/usr/lib/mono/4.5/Facades/System.Runtime.dll /r:/usr/lib/mono/4.5/Facades/System.IO.dll /r:../.dnx/packages/iBoxDB.DNX/2.6.2.16/lib/iBoxDB.DNX.dll Program.cs iBoxDB26.cs
設置包路徑,如果DLL不在當前目錄下
export MONO_PATH=../.dnx/packages/iBoxDB.DNX/2.6.2.16/lib
執行
mono Program.exe
下面是在Linux DNX中使用Mono Framework執行, 不需要mcs編譯, 自動下載包。需要先設置一個參數
export DOTNET_REFERENCE_ASSEMBLIES_PATH="/usr/lib/mono/xbuild-frameworks" ,
然后運行平臺由 dnx***{} 改為 net45{}
"dependencies": { "iBoxDB": "2.7.0.3"}, "frameworks": { "net45": { "frameworkAssemblies":{ "System.Runtime": "4.0.0", "System.IO": "4.0.0" }
dotnet restore
dotnet run
不同系統下的路徑
export DOTNET_REFERENCE_ASSEMBLIES_PATH="/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/xbuild-frameworks"
export DOTNET_REFERENCE_ASSEMBLIES_PATH="/usr/local/lib/mono/xbuild-frameworks"
export DOTNET_REFERENCE_ASSEMBLIES_PATH="/usr/lib/mono/xbuild-frameworks"
新聞熱點
疑難解答