.NET Core、ASP.NET Core 的出現,表示 .NET 開發人員要開始大步跨平臺了,但 .NET Framework 到 .NET Core 到底改變了什麼?
最近在找 Angular 整合 MVC 的範例時,時常找到 .NET Core、ASP.NET Core 的相關範例,就不禁開始關注 .NET Core 這個感覺還有很多坑的技術。
想要用 .NET Core 玩個 Hello World ,根據官網教學,得先裝 .NET Core SDK,教學上也附有載點。
閱讀官方文件手冊後,會得知命令列工具亦是其特色之一,即所有產品案例都可以透過命令列執行,好像很多 Linux 優先的開源都是這種感覺,這次要跨足 Linux, Commend-Line 不能少,所以這一次的 Hello World 不用裝 IDE ,只要下指令就完成了。
首先安裝 .NET Core SDK
為專案創一個新資料夾,並開啟命令提示字元(Power Shell 也可)指向該資料夾,指向資料夾比較方便的方法,一是 Shift + 右鍵選"在此處開啟命令視窗",二是在巡覽列打 cmd 後 Enter。
Hello World 的指令只有三行,執行完就會在命令視窗看到 Hello World!
>dotnet new
>dotnet restore
>dotnet run
dotnet new 會建立主控臺專案範例,內容包含 Hello World 程式碼,Program.cs
using System;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
要是下 dotnet new 跳出錯誤訊息,'dotnet' 不是內部或外部命令、可執行的程式或批次檔。 是因為環境變數還未更新,重開機是比較簡單的方法(但不是唯一)。
dotnet restore 建立 lock file,project.lock.json 內容包含當下環境執行程式所需要載入的元件
donnet run 開始編譯執行,此時會產生 .NET 開發人員常看到的 bin、obj 兩個資料夾放置編譯產物。
而 dotnet restore、donnet run 的產物是不用進版控的,它們只是編譯過程中的產物。
值得一提的是 .NET Framework 的主控臺編譯產物是一個 exe 檔,可以直接執行,但 .NET Core 的編譯產物是一個 dll 檔,必須透過 dotnet.exe 來執行。
雖然外觀不一樣,但上述兩者產出大致本體還是 IL Code 才對,建置一個相同 .NET Framework Hello World 和 .NET Core 比較反組譯後的結果看看,
下圖左邊是 .NET Framework 右邊是 .NET Core ,.NET Framework 基礎型別的使用需要載入 mscorlib.dll 而 .NET Core 則是需要載入 System.Runtime.dll
如果在一個 .NET Framework 專案中想要加入一個 .NET Core 類別庫作為參考,你至少還要再加入 System.Runtime 參考(NuGet 有)。
若將 System.Runtime.dll 反組譯就可看出一些 .NET Core 的端倪,下圖是 System.Runtime.dll 反組譯的一角,內容包含很多常用型別像是 int, short, string 等,大概的意思是
System.Runtime 的 string 是 mscorlib 的 string
System.Runtime 的 short 是 mscorlib 的 short
猜測在不同作業系統中,藉由 System.Runtime 的隔離,基礎型別的引用會自己指到該系統中 .NET Core 的實作
另外,如果 .NET Core 類別庫有使用 Console.WriteLine 的話,.NET Framework 專案還需要再參考 System.Console,而 System.Console 的內容也與 System.Runtime 相像
[參考]