我在谈论.NET时有时会听到/读到它,例如“托管代码”和“非托管代码”,但我不知道它们是什么,它们的区别是什么。根据定义,它们有什么区别?使用它们中的任何一个会产生什么后果?这种区别仅存在于.NET / Windows中吗?
答案 0 :(得分:186)
托管代码是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;
}
答案 1 :(得分:79)
这比.NET和Windows更通用。托管是一个环境,你有自动内存管理,垃圾收集,类型安全,...非托管是其他一切。因此,例如,.NET是一个托管环境,C / C ++是不受管理的。
答案 2 :(得分:13)
托管代码是微软创造的一种差异化,用于识别需要并且只会在公共语言运行时虚拟机的“管理”下执行的计算机程序代码(导致字节码)。
答案 3 :(得分:3)
托管代码是为了定位托管运行时执行环境的服务而编写的代码,例如.Net技术中的公共语言运行时。
在公共语言运行时下运行的托管代码无法在运行时环境之外访问,也无法直接从运行时环境之外调用。它指的是本机执行代码和运行时之间的合作契约。它提供垃圾收集,运行时类型检查,引用检查等服务。通过使用托管代码,您可以避免导致安全漏洞和不稳定应用程序的许多典型编程错误,此外,许多非生产性编程任务会自动处理,例如作为类型安全检查,内存管理,销毁未使用的对象等。
什么是非托管代码?
非托管代码直接编译为机器代码,并由操作系统直接执行。生成的代码在主机处理器上本机运行,处理器直接执行编译器生成的代码。它总是被编译为针对特定体系结构,并且只能在预期的平台上运行。因此,如果要在不同的体系结构上运行相同的代码,则必须使用该特定体系结构重新编译代码。
非托管可执行文件基本上是一个二进制映像,x86代码,直接加载到内存中。这种方法通常会导致代码执行速度最快,但在大多数情况下,诊断和从错误中恢复可能会很困难且耗时。程序员需要处理内存分配,类型安全,安全性等,这将导致非托管代码容易出现缓冲区溢出,指针覆盖等内存泄漏。
传统C / C ++编译器编译的所有代码都是非托管代码。 COM组件,ActiveX接口和Win32 API函数是非托管代码的示例。托管代码是用许多高级编程语言编写的代码,可以与Microsoft .NET Framework一起使用,包括VB.NET,C#,J#,JScript.NET等。因为Visual C ++可以编译为托管代码或非托管代码可以将两者混合在同一个应用程序中。