“managed” 和 “unmanaged”的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (61)

有时我在讨论.NET时会听到/读到它,例如“managed”和“unmanaged”,但我不知道它们是什么,有什么不同。根据定义,它们有什么区别?这种区别只存在于.NET / Windows中吗?

提问于
用户回答回答于

托管代码

托管代码是Visual Basic .NET和C#编译器创建的。它运行在CLR上,除此之外,它还提供垃圾收集,运行时类型检查和引用检查等服务。

非托管代码

非托管代码直接编译为机器代码。因此,通过该定义,所有由传统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++是非托管的。

扫码关注云+社区