我有时在谈论 .NET 时听到/读到它,例如“托管代码”和“非托管代码”,但我不知道它们是什么以及它们有什么区别。根据定义,它们有什么区别?使用其中任何一个的后果是什么?这种区别仅存在于 .NET/Windows 中吗?
最佳答案
托管代码
托管代码是 Visual Basic .NET 和 C# 编译器创建的代码。它在 CLR(公共(public)语言运行时)上运行,除其他外,它提供垃圾收集、运行时类型检查和引用检查等服务。因此,可以将其视为“我的代码由 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;
}
关于.net - "managed"和 "unmanaged"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3563870/