iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
0
自我挑戰組

從零開始的C#新手筆記系列 第 3

Day03 - 執行 Hello C#

今天承接昨天 Hello C# 的內容,昨天只寫到 Hello C# 的程式部分,今天把執行編譯完成吧!

執行這段程式

由於不是使用 Visual Studio IDE(以下簡稱 VS IDE),因此要執行這段程式的話得靠終端機輸入指令才行。

  1. 在終端機中輸入 dotnet run ,也就是執行指令的意思
    ※ 也可以用偵錯模式執行,但程式架構簡單所以不需要
  2. 執行指令後出現如下圖就代表成功囉!
    其實這個動作也就是直接將 C# 程式轉為 IL 中繼資料後再轉為機器語言產出結果,兩個步驟合而為一
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251kGnCLg6hFX.png

如果想像 VS IDE 一樣出現一個獨立視窗出來顯示內容可行嗎?當然可以啦!

  1. 如要像 VS IDE 一樣產生獨立視窗,則需使用 dotnet build 指令
  2. 執行指令後出現如下圖就代表編譯成功了
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251JpZSRVwUzg.png
  3. 編譯出來的檔案在紅框處。
    ※ 其中看到的 .dll 就是第一天提到的 IL 中繼資料檔案,在 Windows 系統安裝軟體後,安裝資料夾內常常會看到 .dll ,就是這個東西。
    https://ithelp.ithome.com.tw/upload/images/20181004/201092519p74j10GJG.png
  4. 執行指令後出現如下圖就代表編譯成功了
    https://ithelp.ithome.com.tw/upload/images/20181004/201092515v4NvzkA3c.png

說好的 .exe 檔呢?

由於 .NET Core 預設 build 出來的檔案都是 .dll ,若要像 VS IDE 一樣產生 .exe 檔,就要將在輸出指令上添加一些參數。
變更為 dotnet build -r win-x64 ,也就是將執行環境 ( runtime ) 設為 windows ,如此一來就會產生 .exe檔囉!
https://ithelp.ithome.com.tw/upload/images/20181004/20109251z6wdBnBZih.png

加入 -r win-x64 輸出 .ext 右下角馬上出現警告視窗,該怎麼處理呢?

https://ithelp.ithome.com.tw/upload/images/20181004/20109251v3rh5LWUbc.png

  1. 點下 Show Output ,會跳到輸出視窗。
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251pFEtDCJB5O.png
  2. 警告視窗一大串,但最主要有問題的是最下面的這段話:

Error: NETSDK1061: 專案是使用 Microsoft.NETCore.App 版本 2.1.4 還原的,但依照目前設定,使用的版本會是 2.1.0。若要解決此問題,請確認用於還原與後續作業 (例如建置或發佈) 的設定相同。一般而言,若在建置或發佈期間設定了 RuntimeIdentifier,但在還原期間未加以設定,就可能發生這個問題。如需詳細資訊,請參閱 https://aka.ms/dotnet-runtime-patch-selection

  1. 點下連結網址看參考資料後可以知道,使用 dotnet build 會隱含使用 dotnet restore 指令,變成使用 restore 內的版本號來發布(非目前 .NET SDK 版本),但 restore 內的版本號不一定是最新的,缺少目前 SDK 版本的程式修補內容,才會出現此問題。

解法:

  • 解法一:
    輸出指令更改為 dotnet build -r win-x64 --no-restore 也就是在指令內加入 --no-restore 使 dotnet restore 指令不會生效,這樣就會使用目前 .NET SDK 版本來發布執行版本,也就包含最新的程式修補內容囉。
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251BbPlwsZNkG.png
  • 解法二:
    在 .csproj 專案檔內新增 <TargetLastestRuntimePatch>True</TargetLatestRuntimePatch> ,這樣就可以直接以目前 .NET SDK 版本進行發布,而不用在指令加上 --no-restore 了。
    ↓ 原本的 .csproj 內容
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251uVCaR9PaAF.png
    ↓ 更改後的 .csproj 內容
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251JYUrIaG61w.png
    ↓ 更改完後會出現 .csproj 更新成功的文字
    https://ithelp.ithome.com.tw/upload/images/20181004/20109251Ce8bkYh88E.png
    之後就可以正常輸入指令而不出現警告囉!

好不容易輸出 .exe 檔,為什麼點一下視窗就消失了呢?

因為 .exe 檔內容會在指令完成後自動關閉,因此就只會看到視窗閃一下就消失囉!
若要讓他像 VS IDE 的 Ctrl + F5 (啟動但不偵錯)一樣會停在目前的狀態,那我們 Program.cs 內要再加入 Console.ReadKey(); 讓他停下來等我們。

Console.Readkey();是讀取任意按鍵的意思,用這種方式讓程式停下來等我們輸入指令後結束,藉由這種方式就能達成類似 VS IDE 偵錯的效果囉!

https://ithelp.ithome.com.tw/upload/images/20181004/20109251rUTOiyrwmR.png

心得:

抱歉今天有點離題了,原本是發現忘記在昨天的筆記中補上 dotnet run 輸出的過程,在順順的使用 dotnet run 指令來處理的時候,腦中突然跳出「能不能輸出的時候變得像 Visual Studio 的啟動偵錯功能一樣是新開一個視窗出來呢?」的想法,於是就跳下去嘗試了@@...也因此有了這份紀錄。

不過也因為這樣而理解 VS IDE 的強大,一個簡單的啟動但不偵錯的功能居然需要隱含了這麼多指令,如果不親自用 VS Code 實踐一次輸出還真不知道。為了 build .exe 檔出來找了不少資料,發現有警告的當下還以為自己是亂動了什麼設定,因此將 .NET Core SDK 及 VS Code 完整移除後又重新安裝一次,之後才開始專心的解決錯誤原因。雖然靠著技術文件跟Google大神終於順利解決了問題,但對於微軟技術文件文謅謅的技術詞也是有看沒有懂(太菜),為了要能夠在筆記內解釋給自己聽反覆咀嚼了很多次,最後終於有點懂了(應該),還是希望解釋沒有錯誤啦。明天會繼續回歸 C# 基礎學習筆記主題的。

參考資料:

本機環境教學課程
如何使用 VS Code 建立 .NET Core 開發環境 ?
獨立式部署執行階段向前復原
dotnet build 命令
dotnet restore 命令


上一篇
Day02 - 建立第一支應用程式 Hello C#
下一篇
Day04 - C# 中的數字
系列文
從零開始的C#新手筆記4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言