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

转载 2012年03月22日 09:30:54
关键是要了解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 方法的调用。

  例如:

  [cpp] view plaincopy ~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方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存。

.Net 托管代码和非托管代码的区别

什么是托管代码(managed code)?       托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去...
  • avon520
  • avon520
  • 2014年06月11日 16:47
  • 1291

C#托管代码与C++非托管代码互相调用

C#托管代码与C++非托管代码互相调用 http://www.cnblogs.com/Jianchidaodi/archive/2009/03/11/1407270.html#1473515 ...
  • cbbbc
  • cbbbc
  • 2015年12月08日 19:44
  • 1358

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

C#如何直接调用非托管代码 标签: c#apidllcallbackstringuser 2011-03-25 16:55 2736人阅读 评论(1) 收藏 举报  分类: DLL(5) ...
  • u010473136
  • u010473136
  • 2016年12月03日 21:11
  • 1071

关于C#托管代码与非托管代码的理解

C#托管代码是什么? 托管代码(Managed Code)实际上就是中间语言(IL)代码。代码编写完毕后进行编译,此时编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。程序...
  • u010272085
  • u010272085
  • 2016年02月20日 09:27
  • 2739

托管DLL和非托管DLL的区别

首先解释一下,托管DLL和非托管DLL的区别。狭义解释讲,托管DLL就在Dotnet环境生成的DLL文件。非托管DLL不是在Dotnet环境生成的DLL文件。      托管DLL文件,可以在D...
  • huang9012
  • huang9012
  • 2013年07月25日 00:44
  • 10629

托管代码与非托管代码之间的封送处理

托管代码与非托管代码之间的封送处理 Yi Zhang and Xiaoying Guo   目录 [InAttribute] 和 [OutAttribute]  关...
  • sgzwiz
  • sgzwiz
  • 2014年11月10日 14:49
  • 3015

托管代码与非托管代码之间与托管程序

自.Net问世以后,我们习惯的VC++,VB编程模式有了很大的变换,托管与非托管的概念也不断映入程序员们的眼帘,可以说.NET正逐步成为编程的主流语言和平台之一。今天不与大家讨论谁主沉浮,也不发表慷慨...
  • yy763496668
  • yy763496668
  • 2016年07月13日 19:50
  • 1157

C# 托管资源 与 非托管资源

C# 托管资源 与 非托管资源托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,.NET可以自动进行回收,主要是指托管堆上分配的内存资源。例如程序中分配的对象,作用域内的变量等...
  • bingkxin
  • bingkxin
  • 2016年03月17日 11:33
  • 973

C#托管代码与C++非托管代码互相调用

转自:http://blog.csdn.net/llddyy123wq/article/details/5620441 C#托管代码与C++非托管代码互相调用 http://www.c...
  • WaitForFree
  • WaitForFree
  • 2013年09月15日 17:44
  • 1718

.Net 托管代码和非托管代码的区别

什么是托管代码(managed code)?       托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET   FRAMEWORK的公共语言运行库(CLR)执行代码前去...
  • Plutus_Lee
  • Plutus_Lee
  • 2013年12月27日 18:03
  • 1098
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.net 托管代码与非托管代码
举报原因:
原因补充:

(最多只允许输入30个字)