📜  .NET中的托管代码和非托管代码

📅  最后修改于: 2021-05-29 23:20:07             🧑  作者: Mango

什么是托管代码?

旨在获取托管运行时环境执行服务的代码(例如.NET Framework中的CLR(通用语言运行时))称为托管代码。它始终由托管运行时环境实现,而不是由操作系统直接执行。托管运行时环境提供了不同类型的服务,例如垃圾收集,类型检查,异常处理,边界检查等,以自动进行编码,而不会受到程序员的干扰。它还为代码提供了内存分配,类型安全性等。该应用程序是用Java,C#,VB.Net等语言编写的,始终针对运行时环境服务来管理执行,并且以这些类型的语言编写的代码称为托管代码。

对于.NET Framework,编译器始终以中间语言(MSIL)编译管理代码,然后创建可执行文件。当程序员运行可执行文件时,CLR的即时编译器将使用本机代码编译特定于底层体系结构的中间语言。在此,此过程在托管的运行时执行环境下进行,因此该环境负责代码的工作。托管代码的执行如下图所示,源代码以.NET Framework的任何语言编写。

托管代码还提供平台独立性,因为当托管代码编译成中间语言时,JIT编译器会在体系结构特定的指令中编译该中间语言。

使用托管代码有什么优势?

  • 就像您使用运行时环境一样,它可以提高应用程序的安全性,它会自动检查内存缓冲区以防止缓冲区溢出。
  • 它自动实现垃圾收集。
  • 它还提供运行时类型检查/动态类型检查。
  • 它还提供了引用检查,这意味着它会检查指向有效对象的引用点,并检查它们是否重复。

托管代码的缺点是什么?

托管语言的主要缺点是不允许您直接分配内存,否则您将无法获得CPU体系结构的低级访问权限。

什么是非托管代码?

由操作系统直接执行的代码称为非托管代码。它始终针对处理器体系结构,并取决于计算机体系结构。编译此代码时,它总是倾向于获得特定的体系结构并始终在该平台上运行,换句话说,每当您要为不同的体系结构执行相同的代码时,都必须根据该体系结构再次重新编译该代码。它总是编译为特定于体系结构的本机代码。
在非托管代码中,内存分配,类型安全性,安全性等由开发人员管理。因此,存在与内存相关的若干问题,例如缓冲区溢出,内存泄漏,指针覆盖等。非托管代码的可执行文件通常在二进制映像中,x86代码直接加载到内存中。用VB 6.0,C,C++等编写的应用程序始终处于非托管代码中。下图显示了非托管代码的执行:

使用非托管代码有什么优势?

  • 它提供了对程序员的低级访问。
  • 它还提供对硬件的直接访问。
  • 它允许程序员绕过托管代码框架使用的某些参数和限制。

非托管代码的缺点是什么?

  • 它不为应用程序提供安全性。
  • 由于可以访问内存分配,因此会发生与内存相关的问题,例如内存缓冲区溢出等。
  • 错误和异常也由程序员处理。
  • 它不专注于垃圾收集。