我有时在谈论.NET时听到/读到它,例如"托管代码"和"非托管代码",但我不知道它们是什么,它们有什么区别.根据定义,它们的区别是什么?使用它们中的任何一个都会产生什么后果?此区别是否仅存在于.NET/Windows中?
我有时在谈论.NET时听到/读到它,例如"托管代码"和"非托管代码",但我不知道它们是什么,它们有什么区别.根据定义,它们的区别是什么?使用它们中的任何一个都会产生什么后果?此区别是否仅存在于.NET/Windows中?
托管代码就是VisualBasic.NET和C#编译器创建.它在CLR(公共语言运行库)上运行,CLR提供垃圾收集、运行时类型判断和引用判断等服务.所以,可以这样想,"我的代码是CLR的managed."
Visual Basic和C#可以only生成托管代码,因此,如果您正在用其中一种语言编写应用程序,那么您编写的就是由CLR托管的应用程序.如果您正在用Visual C++.NET编写应用程序,您可以根据需要生成托管代码,但这是可选的.
非托管代码直接编译为机器代码.因此,根据这个定义,所有由传统C/C++编译器编译的代码都是"非托管代码".此外,由于它编译为机器代码,而不是中间语言,因此不可移植.
没有可用内存管理或CLR提供的任何其他功能.
由于不能使用Visual Basic或C#创建非托管代码,因此在Visual Studio中,所有非托管代码都是用C/C++编写的.
由于VisualC++可以被编译为托管代码或非托管代码,所以可以在同一应用程序中混合这两个代码.这模糊了两者之间的界限,并使定义复杂化,但值得一提的是,如果您使用的第三方库包含一些写得不好的非托管代码,您仍然可能存在内存泄漏.
下面是我在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;
}