為什麼 .NET Core 和 .NET 5 會生成執行檔?
我有一個非常困惑的問題。我理解.NET的方式是這樣的:
- C# 應用程序(原始碼)->
csc.exe(編譯器)->- .NET 應用程序(在 MSIL 中)
如果是這樣,為什麼建構 .NET 應用程序的輸出是 Windows 執行檔?我認為整個想法是您的原始碼編譯為 MSIL,它以本地安裝的 CLR 為目標。但是,.NET Core 和 .NET 5 都會生成一個 Windows 執行檔,它執行在作業系統之上,而不是在虛擬機中。
這與 Java 不同,後者編譯為字節碼文件
.class(不是..exe``.jar我想問的是:為什麼 C# 編譯器不生成在 .NET 上執行的特定應用程序文件類型?例如,
.net與公共語言執行時相關聯的文件?我最好的猜測是,
.exe生成的 Windows 實際上不是Windows 執行檔,而是某種 .NET 執行檔。但是,在那種情況下,為什麼它不能在任何帶有 .NET Core 的平台上執行呢?Linux 不知道.exe文件是什麼。
它是一個正常的執行檔,但它包含的唯一本機程式碼是一個小存根,它將呼叫 .NET 執行時。然後,執行時將檢查嵌入在該文件中的 MSIL 並完成其餘工作。
正如其他答案已經回答的那樣,Windows 上的預設設置是目前生成一個小型主機執行檔,用於啟動 .NET 執行時並載入適當的 MSIL 程序集。
一個有趣的事實是,MSIL 程序集以與所有 windows .exe 或 .dll 文件相同的執行時格式(“PE” - 可移植執行檔)打包。
早期版本的“新 .NET”(.NET Core,現在是 .NET 5+)只生成了可以在所有平台上執行的 .dll 文件,並且需要使用者使用
dotnet theapp.dll才能執行應用程序。雖然這可行,但 .NET Core 3.0 及更高版本也開始生成“應用程序主機”程序集作為替代入口點。生成的程式碼
dotnet publish仍然是跨平台的,但另外生成執行檔有幾個優點:
將經典 .NET Framework 項目遷移到 .NET Core 需要在具有 CI/CD 管道或需要 .exe 文件的工具的大型項目中進行較少的更改。
使用者可以更輕鬆地在任務資源管理器中找到正確的程序 /
ps- 就像找到正確的 java.exe 程序一樣,擁有數百個dotnet.exe程序對於 ops 任務來說有點困難。
dotnet.exeor (linux / macOS)的路徑dotnet可能很難找到或設置。通過使用執行檔,它可以在各個地方查找執行時,並且較少依賴於正確設置的 PATH 環境變數。在 Windows 上,人們可能想要更改 .exe 的特定於作業系統的定義,例如:
- 子系統標誌(GUI 與控制台應用程序):.exe 文件中的標誌控制視窗是否打開控制台視窗。java 有
java.exe和javaw.exe用於控制台與 GUI 程序。.NET Core 3.0+ 應用程序所需的設置可以通過建構過程或項目 SDK(例如 WinForms、WPF)進行自定義。- 嵌入式圖示:Windows .exe 文件可以包含圖示。如果您希望您的應用程序(尤其是 GUI 應用程序)顯示在資源管理器或工作列中並帶有圖示,您需要一個 .exe 文件,您可以使用圖示進行實際修改。
- 嵌入 Win32 清單:清單文件可以控制很多事情,例如提升的訪問要求(這些 .exe 文件會提示您允許管理員訪問)。又是你不能做的事情
dotnet.exe theapp.dll。請注意,由於 Apple 的公證要求,目前在 macOS 上禁用了此執行檔生成。(基本上,您需要對應用程序進行簽名,而蘋果需要對其進行“公證”才能在沒有警告的情況下執行)。