共用方式為


什麼是「受管理程式碼」?

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

簡單地說,Managed 程式代碼就是:其執行是由運行時間所管理的程序代碼。 在這種情況下,不論實作為何,相應的運行時系統稱為 Common Language Runtime(或稱 CLR),例如 Mono、.NET Framework 或 .NET Core/.NET 5+。 CLR 負責擷取受控代碼,將其編譯為機器代碼,然後執行。 除此之外,運行時間會提供數個重要服務,例如自動記憶體管理、安全性界限和類型安全性。

這與執行 C/C++ 程式的方式形成對比,這些程式也稱為「非受控代碼」。 在非受控世界中,程式設計人員幾乎負責一切。 實際程式基本上是作業系統 (OS) 載入記憶體並啟動的二進位檔。 其他一切,從記憶體管理到安全性考慮都是程式設計人員的負擔。

Managed 程式代碼是以可在 .NET 之上執行的其中一種高階語言所撰寫,例如 C#、Visual Basic、F# 等。 當您使用各自的編譯程式編譯以這些語言撰寫的程式代碼時,您不會取得機器程式代碼。 您會取得 中繼語言 程式碼,然後由執行階段編譯並執行。 C++是此規則的其中一個例外,因為它也可以產生在 Windows 上執行的原生非受控二進位檔。

中繼語言 & 的執行

什麼是「中繼語言」(簡稱 IL)? 這是以高階 .NET 語言撰寫之程式代碼編譯的產物。 一旦您編譯以其中一種語言撰寫的程式代碼,您就會得到由 IL 所組成的二進位檔。 請務必注意,IL 是獨立於在執行階段上運行的任何特定語言的;甚至還有一個單獨的規範,如果您有興趣,可以閱讀。

一旦您從高階程式代碼產生 IL,您很可能會想要執行它。 這是 CLR 開始接管並啟動 即時 編譯的過程,或 即時編譯 (JIT) 您的程式碼,將其從 IL 轉換為可以在 CPU 上執行的機器碼。 如此一來,CLR 就能確切知道您的程式代碼運作方式,而且可以有效地 管理 它。

中繼語言有時也稱為通用中繼語言(CIL)。

非管理程式碼互操作性

當然,CLR 允許跨越受控與非受控世界之間的界限,並且有許多程式碼可以這樣做,即使在 .NET 類別庫中也是如此。 這稱為 互操作性,或簡稱 interop。 例如,這些條款可讓您包裝非托管程式庫並加以呼叫。 不過,請務必注意,一旦您這樣做,當程式代碼通過執行環境的界限時,執行的實際管理會再次由非受控程式代碼管理,因此會受到相同的限制。

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

更多資源