簡體   English   中英

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

[英]Difference between “managed” and “unmanaged”

在談論.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 ++可以編譯為托管代碼或非托管代碼,因此可以將兩者混合在同一個應用程序中。 這模糊了兩者之間的界限並使定義復雜化,但值得一提的是,如果您使用第三方庫和一些寫得不好的非托管代碼,那么您仍然可能會遇到內存泄漏。

這是我通過谷歌搜索找到的一個例子:

#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;
}

這比.NET和Windows更通用。 托管是一個環境,你有自動內存管理,垃圾收集,類型安全,...非托管是其他一切。 因此,例如.NET是托管環境,C / C ++是不受管理的。

托管代碼是微軟創造的一種差異化,用於識別需要並且僅在公共語言運行時虛擬機的“管理”下執行的計算機程序代碼(導致字節碼)。

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM