为了账号安全,请及时绑定邮箱和手机立即绑定

“托管”与“非托管”之间的区别

“托管”与“非托管”之间的区别

慕的地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 关注
  • 1375 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信