【发布时间】:2011-04-03 14:15:45
【问题描述】:
我有时在谈论 .NET 时听到/读到它,例如“托管代码”和“非托管代码”,但我不知道它们是什么以及它们的区别是什么。根据定义,它们有什么区别?使用其中任何一个的后果是什么?这种区别仅存在于 .NET/Windows 中吗?
【问题讨论】:
标签: .net windows unmanaged managed
我有时在谈论 .NET 时听到/读到它,例如“托管代码”和“非托管代码”,但我不知道它们是什么以及它们的区别是什么。根据定义,它们有什么区别?使用其中任何一个的后果是什么?这种区别仅存在于 .NET/Windows 中吗?
【问题讨论】:
标签: .net windows unmanaged managed
托管代码是 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++ 可以编译为托管或非托管代码,因此可以在同一个应用程序中混合使用这两种代码。这模糊了两者之间的界限并使定义复杂化,但值得一提的是,如果您使用第三方库和一些写得不好的非托管代码,您仍然可以知道内存泄漏。
这是我在googling找到的一个例子:
#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;
}
【讨论】:
托管代码是 Microsoft 创造的一种区分,用于识别需要并且仅在公共语言运行时虚拟机的“管理”下执行的计算机程序代码(产生字节码)。
【讨论】:
这比 .NET 和 Windows 更通用。托管是一种环境,您可以在其中进行自动内存管理、垃圾收集、类型安全……非托管就是其他一切。例如,.NET 是托管环境,而 C/C++ 是非托管环境。
【讨论】: