dotnet core多平臺開(kāi)發(fā)體驗
隨著(zhù)net core rc2的發(fā)布,園子里面關(guān)于net core的入門(mén)文章也也多了起來(lái),但是大多數都是在一個(gè)平臺上面來(lái)寫(xiě)幾個(gè)簡(jiǎn)單的例子,或者是在解釋代碼本身,并沒(méi)有體現說(shuō)在一個(gè)平臺上面創(chuàng )建一個(gè)項目,然后通過(guò)源碼管理簽出到另一個(gè)平臺上繼續開(kāi)發(fā)。還有就是一次編譯到處運行是如何體現的?這樣類(lèi)型的文章好像還沒(méi)有在哪里看到過(guò),于是我就想自己來(lái)一遍,并把這個(gè)過(guò)程分享出來(lái)給大家。
首先來(lái)個(gè)官方的介紹:
.NET Core - .NET 使用 .NET Core 跨平臺運行
Announcing .NET Core RC2 and .NET Core SDK Preview 1
一、mac os x 上的開(kāi)發(fā)
本來(lái)環(huán)境安裝是不想寫(xiě)的,因為有太多的文章,但是不寫(xiě)的話(huà)又感覺(jué)少了些什么。然后我只有一個(gè)mac和一個(gè)安裝win10的pc,所以就只針對這兩個(gè)平臺來(lái),linux等我有錢(qián)買(mǎi)新電腦再來(lái)折騰。廢話(huà)不多說(shuō),下面開(kāi)始介紹。
mac os x環(huán)境下 dotnet core 的安裝
021yin.com /net/core#macosx
首先要先安裝一個(gè) OpenSSL 這個(gè)是以后 dotnet core 要下載一些依賴(lài)庫什么的會(huì )用到的。可以使用 brew 來(lái)安裝OpenSSL
打開(kāi)命令終端輸入brew安裝命令
021yin.com /Homebrew/install/master/install)"
安裝好brew 之后繼續輸入OpenSSL安裝命令
brew install openssl
brew link --force openssl
這兩個(gè)東西安裝后,我們就可以來(lái)安裝我們我們的core了,下載這么一個(gè)安裝包 點(diǎn)擊下載 這是一個(gè)pkg安裝包。我現在的時(shí)候是 dotnet-dev-osx-x64.1.0.0-preview1-002702.pkg 只要雙擊一下安裝包,然后一直點(diǎn)擊繼續就可以了
安裝完之后可以輸入命令查看dotnet core 有沒(méi)有安裝成功
dotnet -v
命令行下的項目建立與運行
安裝完環(huán)境后,我們就可以來(lái)開(kāi)始我第一個(gè)項目。我們新建一個(gè)文件夾叫做LearnDotnetCore然后打開(kāi)命令窗口 cd 到這個(gè)文件夾下面。然后用命令 dotnet new來(lái)建立初始化一個(gè)項目。初始化完后我們看看到文件夾下面多了兩個(gè)文件 Program.cs project.json
Program.cs 是c#源碼文件,可以用來(lái)實(shí)現我們的具體邏輯
project.json 是配置依賴(lài)框架,依賴(lài)包,版本號,還有其他一些編譯會(huì )用到相關(guān)的東西。這個(gè)作用和nodejs的模式是相類(lèi)似的。
項目創(chuàng )建完之后需要 dotnet restore 來(lái)下載我們配置好的依賴(lài)包。下載完后呢文件夾里面多出了一個(gè) project.lock.json 文件,打開(kāi)來(lái)看,可以看到我們下載了那些依賴(lài)庫,還有一些編譯的引用等。
下載完依賴(lài)庫后,我們可以通過(guò)運行命令 dotnet run 來(lái)編譯運行我們的程序。
編譯完成后,文件夾內會(huì )多出兩個(gè)文件夾 bin 和 obj 。
bin 是我們編譯的完成的文件
obj 里面是一些編譯輸出和動(dòng)態(tài)庫連接等的一些信息。
然后運行我們可以看到輸出 Hello World! 到這來(lái),我們的命令行建立、編譯和運行程序就到這來(lái)結束了。
使用vscode調試運行
021yin.com/en/latest/tutorials/your-first-mac-aspnet.html#running-locally-using-kestrel
單純使用命令行來(lái)開(kāi)發(fā)的話(huà),那么肯定是沒(méi)有那么方便了,但是在但是目前好像也沒(méi)有什么特別好的選,所以我們就使用 Visual Studio Code 然后再安裝一個(gè)插件C# extension
還有一個(gè)叫做Xamarin Studio.,貌似還沒(méi)有支持到 dotnet core的樣子
當然還有一個(gè)叫做 Project Rider的東西,之前 net core 用 DNX 命令的時(shí)候下載來(lái)玩過(guò)一下,支持什么的還可以,不過(guò)很久沒(méi)有玩了,最近一次編譯更新是在 5月17號,也不知道現在支持如何。有興趣的同學(xué)自己下載來(lái)玩下,內容不在本文章中介紹了。
打開(kāi)vscode然后把項目的文件夾拖拉到vscode的窗口上面去,會(huì )在左邊的工作空間欄目中顯示項目的樹(shù)形結構。然后我們選擇project.json,編輯器會(huì )提示你是否要加入調試信息,然后我們點(diǎn)擊yes,目錄結構就會(huì )多出一個(gè).vscode文件夾里面有兩文件 launch.json 和 tasks.json
然后我們去修改 launch.json 里面的內容,把program里面的內容改成我們編譯完成后的dll路徑,當然有的有時(shí)候會(huì )給你自動(dòng)生成好的,不需要自己修改。
"program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/LearnDotnetCore.dll",
還有就是args也修改一下,這個(gè)是main函數的傳入值。
"args": ["我試試看傳入了什么"],
修改完后在Program.cs里面加個(gè)斷點(diǎn),接著(zhù)直接按f5,或者點(diǎn)開(kāi)debug面板,然后點(diǎn)擊那個(gè)調試按鈕開(kāi)始調試
我們可以看到,一個(gè)變量的監視數據,還有就是控制臺打印出了 Hello World!
代碼上傳
我選擇了用github來(lái)保存代碼,并且在window上通過(guò)git下載到vs里面進(jìn)行繼續開(kāi)發(fā)
首先我們打開(kāi)git面板來(lái)初始化git儲存庫
初始化完后,我們可以看到我們有15個(gè)文件要提交,但是我們并不需要把這么多個(gè)文件都給提交了,我們只要提交Program.cs project.json 這兩個(gè)文件,然后在其他地方下載后來(lái)生成其他文件就可以了。
于是,我們就添加了一個(gè).gitignore文件,文件內容添加要排除的東西,然后我們就剩下三個(gè)文件提交了
最后,輸入提交的信息然后點(diǎn)擊那個(gè)勾符號,就提交到本地的庫里面了。
完成了上面的步驟后,我們還需要把庫同步到github上面去。首先,我們去注冊一個(gè)賬戶(hù),然后新建一個(gè)repository,建立過(guò)程自己摸索,就不寫(xiě)的那么詳細。建完后如下圖
然后到我們的目錄下輸入下面的兩條命令
021yin.com /kotcmm/LearnDotnetCore.git
git push -u origin master
如果有用戶(hù)名密碼,就輸入用戶(hù)名密碼,然后存儲庫就同步到了github上面去了。記住地址什么的要改成自己的。
二、window 上的開(kāi)發(fā)
切到win10上面來(lái)繼續完成這個(gè)博文。
開(kāi)發(fā)環(huán)境的安裝
021yin.com /net/core#windows
首先要先下載下面的工具:
Visual Studio Community 2015
DotNetCore.1.0.0.RC2-VS2015Tools.Preview1
這兩個(gè)軟件的安裝就不需要截圖了,先安裝Visual Studio Community 2015再安裝DotNetCore.1.0.0.RC2-VS2015Tools.Preview1。安裝完之后我們打開(kāi)vs 2015,然后把我們之前在mac上面創(chuàng )建的項目給下載下來(lái)。
打vs后我們選擇 open from source control 然后出現左邊的面板,如果沒(méi)有登錄你的github賬號,那么就先登錄你的賬號,然后再點(diǎn)擊Clone出現一個(gè)窗口選擇我們前面上傳的那個(gè)項目。
下載完后雙擊我們的git項目,然后在彈出的窗口里面選擇project.json,就會(huì )生成左邊的那樣項目工程了。
然后我們編譯成功并運行起來(lái)。
到這里我們已經(jīng)成功的把在mac上面創(chuàng )建的項目拉到win下不改任何代碼,然后成功編譯運行了。
發(fā)布運行
參考資料:兩種部署方式
上面的開(kāi)發(fā)過(guò)程中都是直接在id里面運行的,或者用 dotnet run 來(lái)直接運行的,那么我們編譯好之后如何脫離IDE來(lái)運行呢?
我們也可以到編譯成功的目錄 netcoreapp1.0 下面輸入命令 dotnet LearnDotnetCore.dll 來(lái)運行我們的程序。
可以在project.json加個(gè) runtimes 屬性,然后編譯出一個(gè)exe文件,然后直接運行exe。
要編譯成Release的話(huà),可以用命令 dotnet build --configuration Release --no-dependencies --no-incremental 當然build的命令以后可以有單獨的文章來(lái)講解
第一種編譯的配置
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
第二種編譯的配置
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
"dependencies": {
"Microsoft.NETCore.App": {
//"type": "platform",
"version": "1.0.0-rc2-3002702"
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
"runtimes": {
"win10-x64": {},
"osx.10.11-x64": {}
第二種配置使用dotnet publish會(huì )把core的支持運行一起打包處理,然后相關(guān)的平臺就不用安裝net core,但是不同平臺需要不同編譯。具體的效果和目錄結構我就不進(jìn)行截圖了,有興趣的自己編譯看看。
三、改造成web項目
前面介紹了如何編譯和運行控制臺的程序,但是在這個(gè)互聯(lián)網(wǎng)的時(shí)代,我感覺(jué)要做成一個(gè)web項目可能會(huì )更有趣,我們看看如何直接把前面控制臺的項目變成web項目。
021yin.com /git/git-install-setup
vs修改運行
首先修改配置 project.json,在屬性dependencies添加Kestrel依賴(lài)。
第二添加一個(gè)類(lèi)Startup
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
namespace LearnDotnetCore
public class Startup
public void Configure(IApplicationBuilder app)
app.Run(context =>
return context.Response.WriteAsync("Hello from ASP.NET Core!");
然后修改Program.cs
using System;
using Microsoft.AspNetCore.Hosting;
namespace LearnDotnetCore
public class Program
public static void Main(string[] args)
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
然后點(diǎn)擊運行按鈕,程序成功的運行起來(lái)
打開(kāi)瀏覽器訪(fǎng)問(wèn) !證明我們的程序已經(jīng)編譯并運行成功。
發(fā)布并部署iis
雖然說(shuō)直接運行可以訪(fǎng)問(wèn)成功,但是有的人就是喜歡部署到IIS上面去,所以這里也嘗試一下部署到IIS上面是什么樣的。
021yin.com/en/latest/publishing/iis.html
安裝完IIS后需要安裝 DotNetCore.1.0.0.RC2-WindowsHosting來(lái)支持 net core 在iis上面運行
然后修改project.json的內容,添加下面三個(gè)東西,來(lái)支持iis運行
然后修改Program.cs,添加iis支持
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
namespace LearnDotnetCore
public class Program
public static void Main(string[] args)
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
添加文件 web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--
021yin.com /fwlink/?LinkId=786380
-->
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>
上面三個(gè)修改完之后,就可以來(lái)發(fā)布,選擇項目郵件,然后選擇發(fā)布會(huì )出現一個(gè)窗口
輸入名稱(chēng),然后next或者直接publish,操作完成后會(huì )生成一堆文件。然后到iis里面創(chuàng )建 Web 站點(diǎn),然后綁定發(fā)布目錄就行,應用程序池的模式需要改為“無(wú)代碼托管”。
啟動(dòng)網(wǎng)站運行后,瀏覽器輸入里面運行的效果是一樣的。
四、申請vps并上傳項目運行
在文章開(kāi)頭說(shuō)了,沒(méi)有Linux的系統,但是后來(lái)想了一下,還是也體驗一下看看,于是就去 host1plus 買(mǎi)了一個(gè)vps,一個(gè)是可以體驗一下發(fā)布一個(gè)net core 做的網(wǎng)站,另一個(gè)就是以后還可以放一些運行示例什么的。
我買(mǎi)的vps安裝的是centos-7系統,可以使用ssh遠程登錄上去管理。先給安裝一個(gè) net core 的運行環(huán)境。
021yin.com /net/core#centos
輸入安裝命令:
021yin.com /dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
結果返回了錯誤。
dotnet_install: Error: Unable to locate libunwind. Install libunwind to continue
dotnet_install: Error: Unable to locate libicu. Install libicu to continue
dotnet_install: Error: Unable to locate gettext. Install gettext to continue
看起來(lái)是缺少了幾個(gè)玩意,那好吧先來(lái)下載安裝,使用yum命令來(lái)安裝
yum install libunwind
yum install libicu
yum install gettext
重新輸入安裝命令:
021yin.com /dotnet/cli/rel/1.0.0-preview1/scripts/obtain/dotnet-install.sh | bash /dev/stdin --version 1.0.0-preview1-002702 --install-dir ~/dotnet
這次返回的信息是
021yin.com/dotnet/beta/Binaries/1.0.0-preview1-002702/dotnet-dev-centos-x64.1.0.0-preview1-002702.tar.gz
dotnet-install: Extracting zip
dotnet-install: Adding to current process PATH: /root/dotnet. Note: This change will be visible only when sourcing script.
dotnet-install: Installation finished successfuly.
然后再輸入命令
sudo ln -s ~/dotnet/dotnet /usr/local/bin
說(shuō)明:ln是linux中又一個(gè)非常重要命令,它的功能是為某一個(gè)文件在另外一個(gè)位置建立一個(gè)同步的鏈接.當我們需要在不同的目錄,用到相同的文件時(shí),我們不需要在每一個(gè)需要的目錄下都放一個(gè)必須相同的文件,我們只要在某個(gè)固定的目錄,放上該文件,然后在 其它的目錄下用ln命令鏈接(link)它就可以,不必重復的占用磁盤(pán)空間。
然后我們再來(lái)輸入 dotnet 命令看看是否真的安裝成功了。安裝成功之后我們就要把之前編譯發(fā)布好的文件給上傳到vps上面去。(記住是要上傳 dotnet publish發(fā)布出來(lái)的那些文件)
021yin.com /peida/archive/2013/03/15/2960802.html
文件上傳成功后我們執行 dotnet LearnDotnetCore.dll 命令來(lái)運行我們的網(wǎng)站程序。