什麼是 Managed 程式碼?

使用 .NET 時,您通常會遇到「Managed 程式碼」一詞。 本文說明 Managed 程式碼 的意義,並提供其其他資訊。

為了簡單來說,Managed 程式碼只是:其執行是由運行時間管理的程式碼。 在此情況下,不論Mono、.NET Framework或 .NET Core/.NET 5+) 實作為何 (,有問題的執行時間都稱為Common Language Runtime或 CLR。 CLR 負責擷取 Managed 程式碼、將它編譯成機器碼,然後執行它。 除此之外,執行時間會提供數個重要的服務,例如自動記憶體管理、安全性界限和型別安全性。

與此相反的是您執行 C/C++ 程式的方式,又稱為「Unmanaged 程式碼」。 在 Unmanaged 世界中,程式設計人員會負責處理幾乎所有工作。 實際程式基本上是作業系統 (OS) 載入記憶體並啟動的二進位檔。 從記憶體管理到安全性考量等其他工作都是程式設計人員的責任。

Managed 程式碼是以其中一種高階語言撰寫而成 (例如 C#、Visual Basic、F# 等),並可在 .NET 上執行。 當您使用這些語言各自的編譯器來編譯以這些語言撰寫的程式碼時,您不會取得機器碼。 您會取得稍後可供執行階段編譯及執行的中繼語言碼。 這項規則的唯一例外是 C++,因為它也會產生在 Windows 上執行的原生、Unmanaged 二進位檔。

中繼語言 & 執行

什麼是「中繼語言」(簡稱 IL)? 它是以高階 .NET 語言撰寫之程式碼的編譯結果。 當您編譯以其中一種語言撰寫的程式碼之後,您會取得由 IL 所組成的二進位檔。 請務必注意,IL 與在執行階段上執行的任何特定語言都無關;它甚至有個別的規格,如果您想要,可以閱讀此規格。

當您從高階程式碼產生 IL 之後,您可能想要執行它。 此時 CLR 會接管,並開始 Just-In-Time 編譯 (或 JIT-ing) 的程序,以將您的程式碼從 IL 編譯成可實際在 CPU 上執行的機器碼。 如此一來,CLR 就會知道您程式碼的實際功能,並可有效地進行「管理」

中繼語言有時也稱為通用中間語言 (CIL) 或 Microsoft Intermediate Language (MSIL)。

Unmanaged 程式碼互通性

當然,CLR 允許傳遞 Managed 和 Unmanaged 世界之間的界限,而且有許多程式碼可以執行此動作,即使在 .NET 類別庫中也一樣。 這稱為 互通性,或簡短 的 Interop 。 這些佈建可讓您包裝並呼叫 Unmanaged 程式庫。 不過,請務必請注意,一旦您這樣做,當程式碼超過執行階段的界限時,執行的實際管理會再次交由 Unmanaged 程式碼,因此會受到相同的限制。

與此類似,C# 是一種語言,可讓您使用非受控建構,例如直接在程式碼中使用指標,方法是利用所謂的 不安全內容,以指定執行不受 CLR 管理的程式碼片段。

其他資源