.net 托管代码与非托管代码

关键是要了解CLR(公共语言运行时)
.Net Framework 是由彼此独立又相关的两部分组成:CLR 和 类库, CLR是它为我们提供的服务,类库是它实现的功能. .NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务
当你为.NET Framework编译源代码的时候,得到的目标代码不是CPU能识别的机器指令,而是一种叫做"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR提供了一个实时编译器,用来把IL代码编译为本机机器代码.这样一来,CLR能够使代码变得可移植,因为.NET应用程序的源代码必须被编译为IL代码,这些IL代码可以运行在任何提供CLR服务的平台上.从CLR的角度来看,所有的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各种语言的互操作性.
为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码(也就是你多年以来一直编写的代码)叫"非托管代码".
讨论到C++在.NET托管环境中的应用,由于C++不是为.NET平台设计的语言,所以,微软需要对C++作一些扩充,这就引入了"托管扩展"这一概念,它允许我们在C++项目中使用.NET Framework,如果有下列开发需要,就必须使用托管扩展:
1. 将现有的C++代码移植到托管环境中
2. 在C++代码中访问.NET Framework类
3. 通过.NET语言访问现有的C++代码

托管代码是一种类似于JAVA虚拟机类似的代码,但与JAVA虚拟机不同,它的执行效率还是非常好,它被叫做IL码,或是MSIL码,即中间码的意思
非托管代码就是本地代码的意思,就是说在执行时是直接送往CPU的,

COM/COM++组件,ActiveX控件,API函数,指针运算,自制的资源文件...这些的非托管的,其它就是托管的.

对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。

对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。

我想说到这里,一定要清楚什么是托管资源,什么是非托管资源了?

最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader

,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候很多都没有注意到!

关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。

非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。默认情况下,Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 Finalize 方法。然而大家都可以发现在实际的编程中根本无法override方法Finalize(),在C#中,可以通过析构函数自动生成 Finalize 方法和对基类的 Finalize 方法的调用。

例如:
~MyClass()
{
// Perform some cleanup operations here.
}
该代码隐式翻译为下面的代码。
protected override void Finalize()
{
try
{
// Perform some cleanup operations here.
}
finally
{
base.Finalize();
}
}

但是,在编程中,并不建议进行override方法Finalize(),因为,实现 Finalize 方法或析构函数对性能可能会有负面影响。一个简单的理由如下:用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收,当垃圾回收器回收时,它只回收没有终结器(Finalize方法)的不可访问的内存,这时他不能回收具有终结器(Finalize方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存。

摘自:http://wenku.baidu.com/link?url=LGTBo9u4d0QOC38bJTO5WEjK_WIR_ahLXuNXYscDgkKysaTfueWAM5Qn7eV7AX2S67iEc8B1jQLTTuKEp-DEmBGEkirXRCIiS8fz09BWUXm

时间: 2024-10-23 00:14:51

.net 托管代码与非托管代码的相关文章

【转】托管代码和非托管代码的区别

[转]托管代码和非托管代码的区别 什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:       1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)       2.托管代码编译为microsoft的平台专用语言. 编译器把代码编译成中间语言(IL),而不是能直接在你的电

Net Framework 中托管代码与非托管代码的区别

托管代码与非托管代码的区别 1 简单的说,就是代码被编译成MSIL后在.net的Framework下运行,同操作系统底层的交互都交给framework去做. 所谓非托管代码就是脱离了Framework的管制,直接同底层API打交道,自己管理自己的内存和安全机制等东西.而托管代码就不管这些,全都由Framework去完成 2 “程序”一般都是在对操作系统进行直接或者间接的操作 “托管程序”是需要通过访问公共语言运行时(cls)才能访问操作系统的程序 而“非托管程序”不用通过访问公共语言运行时(cl

托管代码和非托管代码

什么是托管代码(managed code)? 托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:       1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)       2.托管代码编译为microsoft的平台专用语言. 编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在

C#托管代码、非托管代码及回收机制

网上找了下相关文字,发现一些很不错的,转过来,方便以后查看 托管代码 托管代码就是Visual Basic .NET和C#编译器编译出来的代码.编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码.中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据.你可以拷贝这个程序集到另一台服务器上部署它.通常来说,这个拷贝的动作就是部署流程中唯一的一个操作. 托管代码在公共语言运行库(CLR)中运行.这个运行库

托管代码和非托管代码的概念

1.托管代码是Microsoft的中间语言,作用是.NET FRAMEWORK的运行时环境CLR执行代码前去编译源代码,充当翻译的作用: 2.简单的说,就是托管代码被编译成中间语言MSIL后在.NET的Framework下运行,同操作系统底层的交互都交给Framework去做.所谓非托管代码就是脱离了Framework的管制,直接同底层API打交道,自己管理自己的内存和安全机制等东西.而托管代码不管这些,全都有Framework去完成: 3.托管程序是需要通过访问公共语言运行时cls才能访问操作

C#中的托管代码与非托管代码

官方给出的定义是: 托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行.编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用.随着程序集的运行,CLR提供各种服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等. 非托管代码,直接编译成目标计算机码,由操作系统直接执行,代码必须自己提供垃圾回收,类型检查,安全支持等服务.如需要内存管理等服务,必须显示调用操作

.NET托管代码和非托管代码

.net托管代码是运行在.NET FRAMEWORK上的,类似于JAVA虚拟机托管代码:属安全代码,因为不涉及指针,但相对性能上较低,C#写出来的东西就可以认为是托管代码非托管代码:非安全的,可以使用指针,性能较高,C++那是写出来的东西就可以认为是非托管代码,还有比如MFC等等一般地,项目开发用托管代码即可.简单来说:托管代码就是把有关内存管理的操作全都由CLR来管理,也就是把底层的一些操作全都封装起来了(安全性上就相对高点,因为不能直接进行内存读取,不会出现内存溢出之类的问题,但相对的,性能

【转帖】C# DllImport 系统调用使用详解 托管代码的介绍 EntryPoint的使用

1      DLLImport的使用 using System; using System.Runtime.InteropServices; //命名空间 class Example { //用DllImport 导入Win32的MessageBox函数 [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int MessageBox(IntPtr hWnd, String text, S

C#如何直接调用非托管代码

C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2.  调用 COM 对象上的接口方法 我主要讨论从dll中导出函数,基本步骤如下: 1.使用 C# 关键字 static 和 extern 声明方法. 2.将 DllImport 属性附加到该方法.DllImport 属性允许您指定包含该方法的DLL 的名称. 3.如果需要,为方法的参数和返回值指定自定义封送处理信息,这将重写 .NET Framework 的默认封送处理. 好,我们开始 1.首先我们查询M