亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

慕的地10843 2019-11-07 11:04:18
在談論.NET時,我有時會聽到/聽說過它,例如“托管代碼”和“非托管代碼”,但我不知道它們是什么以及它們之間有什么區別。根據定義,它們有什么區別?使用其中任何一個的后果是什么?僅在.NET / Windows中存在這種區別嗎?
查看完整描述

3 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

托管代碼

托管代碼是Visual Basic .NET和C#編譯器創建的。它運行在CLR(公共語言運行時)上,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;

}


查看完整回答
反對 回復 2019-11-07
  • 3 回答
  • 0 關注
  • 1423 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號