c#非托管

转载 2007年09月24日 20:51:00
非托管
在.net 编程环境中,系统的资源分为托管资源和非托管资源。
对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.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方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存
  

C#动态调用非托管DLL(一)

         尝试着在C#下调用以前Delphi写的一些DLL,基本实现动态调用,传入回调函数,及调用带结构数组指针作为参数的函数.     虽然DllImport可以方便的静态调用DLL的函数,...
  • awin
  • awin
  • 2007年02月01日 21:50
  • 1352

C#动态调用非托管DLL

尝试着在C#下调用以前Delphi写的一些DLL,基本实现动态调用,传入回调函数,及调用带结构数组指针作为参数的函数.     虽然DllImport可以方便的静态调用DLL的函数,但在.net2.0...
  • prince_lintb
  • prince_lintb
  • 2007年09月24日 17:06
  • 1186

C# 托管内存与非托管内存之间的转换

C# 托管内存与非托管内存之间的转换c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们...
  • menjiawan
  • menjiawan
  • 2015年09月25日 15:42
  • 1821

C#的三大难点之二:托管与非托管

转载自:http://blog.sina.com.cn/s/blog_3e51bb390102vv6b.html 托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法...
  • sibaison
  • sibaison
  • 2017年05月24日 12:37
  • 357

在.net C#里调用非托管动态库函数dll(转)

有一个动态库:Dog.dll中个函数(只有这个函数):int DogIsValid() ,用VC6开发确认已经导出来,也就是说在别的地方能调用。然后在C#里用如下代码调用: using System....
  • hyde82
  • hyde82
  • 2005年12月13日 16:53
  • 4103

C#中调用非托管的DLL及参数传递 (一)

微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类中继承。但是你...
  • F7ANTY
  • F7ANTY
  • 2012年02月23日 21:56
  • 1016

C# 托管内存与非托管内存之间的转换(结合Unity3d的实际开发)

1.c#的托管代码和非托管代码 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工...
  • leonwei
  • leonwei
  • 2014年12月15日 12:16
  • 11075

C# 非托管资源释放

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R...
  • shuyizhi
  • shuyizhi
  • 2016年03月09日 11:29
  • 843

C# 中如何调用DLL文件(分两种情况,托管与非托管)

C# 中如何调用DLL文件? 2010-11-28 08:46yanghao717  分类:C#/.NET | 浏览 14452 次  C#编程 我在网上找了好久都没看明白,所以来这...
  • liushouwen123
  • liushouwen123
  • 2015年08月05日 21:47
  • 1433

C#Lab(二):托管类型和非托管类型以及获取字节大小

一.前言上一篇已经验证过了,结构体包含引用仍然不改变其值类型的特性。 但是对于结构体如何存储(包含)引用类型一直搞不清楚。 后来想到通过其字节大小验证这一猜想:结构体只是包含了引用类型的“存储地址...
  • qq_26276097
  • qq_26276097
  • 2017年07月24日 02:56
  • 301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#非托管
举报原因:
原因补充:

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