代码之家  ›  专栏  ›  技术社区  ›  Louis Rhys

“托管”和“非托管”的区别

  •  135
  • Louis Rhys  · 技术社区  · 15 年前

    我有时在谈论.NET时听到/读到它,例如“托管代码”和“非托管代码”,但我不知道它们是什么,它们的区别是什么。从定义上讲,它们的区别是什么?使用它们的后果是什么?这种区别只存在于.NET/Windows中吗?

    4 回复  |  直到 9 年前
        1
  •  186
  •   kurige    15 年前

    托管代码

    托管代码是Visual Basic.NET和C编译器创建的代码。它运行在clr(公共语言运行时)上,它提供垃圾收集、运行时类型检查和引用检查等服务。所以,把它想成,“我的代码是 管理 由CLR。”

    Visual Basic和C_can 只有 生成托管代码,因此,如果您正在用其中一种语言编写应用程序,那么您正在编写由CLR管理的应用程序。如果您在VisualC++.NET中编写应用程序,如果您愿意,可以生成托管代码,但它是可选的。

    非托管代码

    非托管代码直接编译为计算机代码。因此,由传统C/C++编译器编译的所有代码都是“非托管代码”。而且,由于它编译为机器代码而不是中间语言,因此不可移植。

    没有可用内存管理或clr提供的任何其他内容。

    由于您不能用VisualBasic或C语言创建非托管代码,所以在VisualStudio中,所有非托管代码都是用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;
    }
    
        2
  •  79
  •   Darin Dimitrov    15 年前

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

        3
  •  13
  •   RobertPitt    15 年前

    托管代码是微软创造的一种区别,它用来识别计算机程序代码,这些代码需要并且只在公共语言运行时虚拟机的“管理”下执行(从而产生字节码)。

    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

        4
  •  3
  •   user6315415    10 年前

    托管代码是为托管运行时执行环境(如.NET技术中的公共语言运行时)的服务编写的代码。

    在公共语言运行库下运行的托管代码不能在运行库环境外访问,也不能直接从运行库环境外调用。它是指本机执行代码和运行时之间的合作契约。它提供垃圾收集、运行时类型检查、引用检查等服务。通过使用托管代码,您可以避免许多典型的编程错误,这些错误会导致安全漏洞和不稳定的应用程序,同时,许多非生产性的编程任务也会被自动处理,例如类型安全检查、内存管理、销毁未使用物体的离子等。

    什么是非托管代码?

    非托管代码直接编译到机器代码并由操作系统直接执行。生成的代码本机运行在主机处理器上,处理器直接执行编译器生成的代码。它总是针对特定的体系结构进行编译,并且只在预期的平台上运行。因此,如果您想在不同的体系结构上运行相同的代码,那么您必须使用该特定的体系结构重新编译代码。

    非托管可执行文件基本上是一个二进制映像,即x86代码,直接加载到内存中。这种方法通常会导致最快的代码执行,但在大多数情况下,诊断和从错误中恢复可能很困难,而且耗时。内存分配、类型安全、安全性等需要由程序员负责,这将导致非托管代码容易出现内存泄漏,如缓冲区溢出、指针重写等。

    所有由传统C/C++编译器编译的代码都是非托管代码。COM组件、ActiveX接口和Win32API函数是非托管代码的示例。托管代码是用许多高级编程语言编写的代码,这些代码可用于微软.NET框架,包括VB.NET、C.Y.J、JyScript、JScript、.NET等。因为VisualC++可以被编译为托管代码或非托管代码,所以可以在同一个应用程序中混合这两个代码。

    推荐文章