“管理”与“非管理”的区别

我有时在谈论它时听到/读到它。NET,例如“托管代码”和“非托管代码”,但我不知道它们是什么,它们有什么不同。根据定义,他们有什么不同?使用其中任何一种的后果是什么?这种区别是否存在于。NET/Windows?

107732 次浏览

这比。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

托管代码

托管代码是什么 VisualBasic。NET 和 C # 编译器创建。它运行在 CLR (通用语言运行库)上,它提供诸如垃圾收集、运行时类型检查和引用检查等服务。所以,可以把它想象成“我的代码是由 CLR 编写的 管理

VisualBasic 和 C # 可以生成托管代码,因此,如果您使用这些语言之一编写应用程序,那么您就是在编写由 CLR 管理的应用程序。如果使用 VisualC + + 编写应用程序。NET,你可以生成托管代码,如果你喜欢,但它是可选的。

非托管代码

非托管代码直接编译为机器代码。因此,根据这个定义,所有由传统 C/C + + 编译器编译的代码都是“非托管代码”。此外,由于它可以编译成机器代码,而不是中间语言,因此它是不可移植的。

没有免费的内存管理或 CLR 提供的任何其他功能。

由于不能使用 VisualBasic 或 C # 创建非托管代码,因此在 VisualStudio 中所有非托管代码都是用 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;
}