在了解了关于托管代码和非托管代码的许多信息后,我知道唯一的区别就是托管代码基于CLR,而非托管代码则在CLR之外。这让我真的很好奇,想详细了解一下。关于托管和非托管代码、内存和大小,到底是什么意思呢?
我写的C#代码怎么可能是非托管的,既然这是C#代码,内存大小又怎么变成了非托管的呢?举个例子并进行一些解释会很有帮助。
简短回答:
详细回答:
托管代码是Visual Basic .NET和C#编译器创建的代码。它编译为中间语言(IL),而不是可以直接在计算机上运行的机器码。 CIL存储在一个称为程序集的文件中,其中包含描述您创建的代码的类,方法和属性(例如安全要求)的元数据。这个程序集是.NET世界中的一站式部署单位。将其复制到另一台服务器以在那里部署程序集-通常这是部署所需的唯一步骤。
托管代码在公共语言运行时中运行。运行时为您的运行代码提供各种服务。在通常的事件过程中,它首先加载和验证程序集以确保CIL没有问题。然后,在需要时,随着方法的调用,运行时会安排将其编译为适合运行程序集的机器码,并缓存此机器码以在下次调用该方法时使用。 (这称为即时编译,或JIT编译,或通常只是Jitting。)
随着程序集的运行,运行时继续提供安全性,内存管理,线程等服务。应用程序由运行时管理。
Visual Basic .NET和C#只能生成托管代码。如果您正在使用这些应用程序,则正在制作托管代码。如果您愿意,Visual C++ .NET也可以生成托管代码:创建项目时,请选择以“.Managed”开头的应用程序类型之一,例如“Managed C ++应用程序”。(来源)
托管代码运行在应用程序域中,非托管代码在操作系统的进程下运行。
非托管代码 :-
1.在.NET框架之外开发的代码称为非托管代码。
2.不受CLR控制的应用程序被称为非托管代码,某些语言如C++可用于编写此类应用程序,例如访问操作系统的低级功能。与VB、ASP和COM代码的背景兼容性是非托管代码的例子。
3.非托管代码通过包装器类执行。
4.包装器类分为两种类型:CCW(COM可调用包装器)和RCW(运行时可调用包装器)。
5.使用包装器来覆盖差异,其中CCW和RCW提供帮助。 管理代码 应用程序域内的资源是管理代码。域内的资源更快。
管理代码 1.在.NET框架中开发的代码称为管理代码。 该代码直接由CLR执行,借助于管理代码执行。任何在.NET Framework中编写的语言都是管理代码。
2.管理代码使用CLR,CLR负责管理内存、处理安全性、允许跨语言调试等。
通常情况下,托管代码的运行时内存占用比同等精良编写的非托管(本地)代码更高。
直接在操作系统下运行的应用程序称为
非托管应用程序
而在.net框架下运行的应用程序则被称为
托管应用程序