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

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景       在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候...
  • CSDNwei
  • CSDNwei
  • 2015年12月23日 09:58
  • 1360

使用平台调用(PInvoke)实现C#调用非托管C++代码

1.问题描述众所周知,不同的语言有不同的优势,如何让不同的语言在一个程序中“各司其职”、“分工协作”一直是一个人们想要达到的目标。有许多时候,我们需要用C#语言调用C++语言写成的代码:一方面,C#在...

在C#调用C++的DLL简析(一)——生成非托管dll

经过一晚上的折腾,还是下点决心将些许的心得写下来,以免以后重复劳动。 C#与C/C++相比,前者的优势在于UI,后者的优势在于算法,C++下的指针虽然恶心,若使用得当还是相当方便的,...

C#直接调用C++非托管结构体、类、成员函数、成员变量

[StructLayout(LayoutKind.Sequential)] public class MyOGRE { //该方式是直接调用C+...

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

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

C++ 非托管COM在C#下调用的问题

最近打算使用新思的触摸板开发包实现一个手势软件 整个SDK主要由以下几部分组成: 说明文档 样例代码 .dll动态链接库文件 .lib库文件 .h头文件 新思的SDK是已...
  • lj94093
  • lj94093
  • 2016年08月24日 16:52
  • 166

C#与非托管win32函数互操作方法

一、引言   .NET平台下实现互操作性有三种技术——平台调用,C++ Interop和COM Interop,下面介绍第一种技术,即平台调用。然而朋友们应该会有这样的疑问,平台调用到底有什么用呢?...
  • kllxyu
  • kllxyu
  • 2013年12月03日 16:01
  • 745

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

?????? 微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类...

VC6下非托管程序调用C#编写的动态库

首先要把C#编写的动态库编译成COM接口,具体办法请
  • sirdan
  • sirdan
  • 2014年05月07日 17:32
  • 698

C#通过DllImport引入dll中的C++非托管类

首先从msdn了解到,DllImport是用来将特性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。 从以上语句我们可以理解出三点: 1.C++编写的非托管dll可以通过DllImpor...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#非托管
举报原因:
原因补充:

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