Dot-Net

“託管”和“非託管”之間的區別

  • August 25, 2010

我有時在談論 .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;
}

引用自:https://stackoverflow.com/questions/3563870