托管代码和非托管代码

     托管代码和非托管代码有什么区别呢?从字面上理解,只是一个是被托管的,另一个是没有被托管的。但是,被托管的托管代码是被谁管着呢?让我们先来看看它们的定义。

     托管代码:由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。

     非托管代码:在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务,它与托管代码不同,后者从公共语言运行库中获得这些服务,而非托管代码是在运行库之外运行的代码。例如COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。

     从上面的定义中,有很人可能可以很好的理解。但是也有一些初学者可能看的会一头雾水。所以我就来谈谈我的理解吧。

     在我的理解中,托管代码就是要首先经过一个中间程序进行编译(如微软的CLR),在编译后才能被发送到计算机中进行执行。通过这样的一个中间过程,程序在内存中运行的时候,它所占据的内存空间是固定的,它只能子它所占据的内存空间中运行。其它的程序也不能够对它的内存中的内容进行修改。而非托管代码它所战据的空间不是国定的,而且其它程序也能对它内存中的数据进行修改。

     下面举一个别人讲的例子:比如一个游戏修改器,有经常玩单机游戏的朋友都知道。一个游戏可以用游戏修改器来修改游戏的一些属性。比如:金钱、武器、攻击、生命等等。那么有的修改器(我不知到是不是全部,希望有知道的朋友跟我说一下)就是通过对游戏运行是的内存中的数据进行修改的。而这些可以用这种方法进行修改的游戏很可能就是用非托管代码语言进行编写的(如:C、C++)。而如果编写游戏的代码语言是受托管的(如:C#,那么就不可能用这种方法进行修改。

     下面画一个简单托管代码和非托管代码的执行过程:

      托管代码与非托管代码

从上图能够很明白的看出它们的不同。

托管代码:

  1、运行的效率相对较低(因为多了一步CLR编译),但安全性相对较高。

  2、可以用在对安全性要求较高的地方。例如:企业内部管理系统、大型电商网站。

非托管代码:

  1、运行的效率相对较高,但安全性相对较低。

  2、用在运行效率要求较高的地方。例如:系统软件、底层软件、驱动程序等。

 

因为本人也是新手,难免有很多错误的地方。请别见怪。

posted @ 2012-12-03 23:14  慢就是快  阅读(375)  评论(0编辑  收藏  举报