“托管”与“非托管”之间的区别


138

在谈论.NET时,我有时会听到/听说过它,例如“托管代码”和“非托管代码”,但我不知道它们是什么以及它们之间有什么区别。根据定义,它们有什么区别?使用其中任何一个的后果是什么?仅在.NET / Windows中存在这种区别吗?


Answers:


190

托管代码

托管代码是Visual Basic .NET和C#编译器创建的。它在CLR(公共语言运行时)上运行,除其他事项外,CLR提供诸如垃圾收集,运行时类型检查和引用检查之类的服务。因此,可以将其视为“我的代码由CLR 管理 ”。

Visual Basic和C#只能生成托管代码,因此,如果您使用这些语言之一编写应用程序,则您将编写由CLR管理的应用程序。如果使用Visual C ++ .NET编写应用程序,则可以根据需要生成托管代码,但这是可选的。

非托管代码

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

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

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

11
“由于无法使用Visual Basic或C#创建非托管代码,因此所有非托管代码均以C / C ++编写。” 您知道,除了C,C ++,C#和VB,还有其他语言。我用Delphi编写非托管代码。同样,托管(.NET)代码和非托管(Win32)代码之间的一个明显区别是,前者可以使用所有.NET函数,而后者则使用本机Windows API。
Andreas Rejbrand 2010年

22
发明了术语“托管”和“非托管”以区分机器代码和IR。因此,它们仅在.NET上下文中才真正有意义。linux内核也可以编译为非托管代码,但这与讨论无关紧要,不是吗?
kurige 2010年

6
这是越来越偏离主题,但我的观点是,你没有选择写作的管理在Delphi代码,这样的声明,你写非托管在Delphi代码是高度冗余的。无论如何,我都在有罪的句子中添加了“在Visual Studio中”。另外,感谢您注意错别字。我不知何故甚至连第二遍也没看。
kurige 2010年

仅仅作为一个书呆子,就有可能用C#编写非托管代码(称为“不安全”代码
基本

2
@JacksonTale Java不在.NET上下文中,因此不适用托管或非托管的概念。有关Java编译方式的说明,请参见stackoverflow.com/questions/1326071/…
埃文·弗里施

84

它比.NET和Windows更通用。托管是一种环境,您可以在其中进行自动内存管理,垃圾回收,类型安全,...托管以外的其他一切。因此,例如,.NET是托管环境,而C / C ++是非托管环境。


根据这个定义,JavaScript也是非托管代码,对吗?
汉普顿特里

@HamptonTerry Javascript具有自动内存管理,垃圾回收和类型安全性。Javascript是托管的。
Sancarn

13

托管代码是Microsoft提出的一种区分形式,用于标识需要且仅在公共语言运行时虚拟机的“管理”下执行(导致字节码)的计算机程序代码。

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


1
是。为了补充这个答案,托管代码是您通常使用.NET函数在.NET(例如,在C#中)中编写的代码。另一方面,使用本地Windows API(可能以任何语言编写,可能使用C语言编写)的本地Windows应用程序都是“不受管理的”。
Andreas Rejbrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.