Dot-Net
“託管”和“非託管”之間的區別
我有時在談論 .NET 時聽到/讀到它,例如“託管程式碼”和“非託管程式碼”,但我不知道它們是什麼以及它們的區別是什麼。根據定義,它們有什麼區別?使用其中任何一個的後果是什麼?這種區別僅存在於 .NET/Windows 中嗎?
託管程式碼
託管程式碼是 Visual Basic .NET 和 C# 編譯器創建的。它在 CLR(公共語言執行時)上執行,除其他外,它提供垃圾收集、執行時類型檢查和引用檢查等服務。因此,可以將其視為“我的程式碼由 CLR 管理” 。
Visual Basic 和 C#只能生成託管程式碼,因此,如果您正在使用其中一種語言編寫應用程序,那麼您就是在編寫由 CLR 管理的應用程序。如果您在 Visual C++ .NET 中編寫應用程序,您可以根據需要生成託管程式碼,但它是可選的。
非託管程式碼
非託管程式碼直接編譯為機器程式碼。因此,根據該定義,傳統 C/C++ 編譯器編譯的所有程式碼都是“非託管程式碼”。此外,由於它編譯為機器程式碼而不是中間語言,因此它是不可移植的。
沒有可用的記憶體管理或 CLR 提供的任何其他內容。
由於您無法使用 Visual Basic 或 C# 創建非託管程式碼,因此在 Visual Studio 中,所有非託管程式碼都是用 C/C++ 編寫的。
將兩者混合
由於 Visual C++ 可以編譯為託管或非託管程式碼,因此可以在同一個應用程序中混合使用這兩種程式碼。這模糊了兩者之間的界限並使定義復雜化,但值得一提的是,如果您使用第三方庫和一些寫得不好的非託管程式碼,您仍然可能會發生記憶體洩漏。
這是我通過Google搜尋找到的一個範例:
#using <mscorlib.dll> using namespace System; #include "stdio.h" void ManagedFunction() { printf("Hello, I'm managed in this section\n"); } #pragma unmanaged UnmanagedFunction() { printf("Hello, I am unmanaged through the wonder of IJW!\n"); ManagedFunction(); } #pragma managed int main() { UnmanagedFunction(); return 0; }