【问题标题】:Difference between "managed" and "unmanaged"“托管”和“非托管”之间的区别
【发布时间】:2011-04-03 14:15:45
【问题描述】:

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

【问题讨论】:

标签: .net windows unmanaged managed


【解决方案1】:

托管代码

托管代码是 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;
}

【讨论】:

  • “由于您无法使用 Visual Basic 或 C# 创建非托管代码,因此所有非托管代码都是用 C/C++ 编写的。”?你知道,除了 C、C++、C# 和 VB 之外,还有其他语言。我使用 Delphi 编写非托管代码。此外,托管 (.NET) 和非托管 (Win32) 代码之间的一个相当明显的区别是,前者可以使用所有 .NET 函数,而后者使用本机 Windows API。
  • 发明了术语“托管”和“非托管”以区分机器代码和 IR。因此,它们只有在 .NET 的上下文中才真正有意义。 linux 内核也可以编译为非托管代码,但这与讨论无关,是吗?
  • 这有点离题了,但我的意思是你没有在 Delphi 中编写 managed 代码的选项,所以说明您在 Delphi 中编写 非托管 代码是高度冗余的。无论如何,我在有问题的句子中添加了“in visual studio”。另外,感谢您对错字的提醒。不知何故,即使第二次通读,我也错过了它。
  • 做个书呆子,可以用C#写非托管代码(known as "unsafe" code)
  • @JacksonTale Java 不在 .NET 的上下文中,因此托管或非托管的概念不适用。有关 Java 编译方式的说明,请参阅 stackoverflow.com/questions/1326071/…
【解决方案2】:

托管代码是 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

【讨论】:

  • 是的。为了补充这个答案,托管代码是您通常使用 .NET 函数在 .NET 中(例如在 C# 中)编写的代码。另一方面,使用本机 Windows API(用任何语言编写,可能是 C)的本机 Windows 应用程序是“非托管的”。
【解决方案3】:

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

【讨论】:

  • 按照这个定义,JavaScript 也是非托管代码,对吗?
  • @HamptonTerry Javascript 具有自动内存管理、垃圾收集和类型安全......所以没有。 Javascript 是托管的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多