立即释放.net下的com组件

众所周知,在.net的世界里,程序员只负责使用new创建对象,而对象的销毁则完全交给垃圾回收器负责,只有当发生垃圾回收的时候,.net中的类型才会被销毁。这通常不会引起什么不妥。但是,当使用了非托管的com对象的时候,则会带来特别的问题。
com使用引用计数来确定对象的生存期,com客户每次引用对象的时候,就调用IUnKnown->AddRef(),而每次释放对象的时候,就调用IUnKnown->Release(),一旦引用计数达到零,就释放实例。问题就这样产生了,让我们看下面的代码:
这是在CSDN的asp.net版广为流传的一段使用excel com组件导出excel文件到客户端的c#代码,在添加这段代码之前,运行了添加com引用的向导。
Excel.Application  oExcel; 
Excel.Workbook  oBook; 
Object  oMissing  =  System.Reflection.Missing.Value; 
oExcel  =  new  Excel.Application(); 
oBook  =  oExcel.Workbooks.Add(oMissing); 
for  (int  i=1;i  <=4;i++) 

 oExcel.Cells[i,1]=i.ToString(); 
 oExcel.Cells[i,2]=  "'bbb2  "; 
 oExcel.Cells[i,3]=  "'ccc3  "; 
 oExcel.Cells[i,4]=  "'aaa4  "; 

oBook.Saved  =  true; 
oExcel.UserControl  =  false; 
string filename = DateTime.Now.Ticks.ToString();
string  mm=Server.MapPath(  ".")+ "\\" + filename + ".xls";//服务器保存地址 
oExcel.ActiveWorkbook.SaveCopyAs  (mm); 
oExcel.Quit();
//GC.Collect();
Response.Redirect(filename+".xls");

这段代码能够实现导出文件的功能,但是如果察看Windows任务管理器,就会发现如下图的精彩场面

于是,有人就在代码中加了一句“GC.Collect();”,很好,EXCEL.EXE没有那么多了,如下图。

但是,如何能彻底释放呢?

幸运的是,在.net中,允许程序员显式地自己调用com的Release方法,这个方法经过.net的包装,叫做System.Runtime.InteropServices.Marshal.ReleaseComObject,在上面的代码中,调用“GC.Collect();”之前,先调用“System.Runtime.InteropServices.Marshal.ReleaseComObject((object)oExcel);”,把引用计数减一,这样,引用计数就变成了零,垃圾回收发生时,oExcel所对应的com对象,就被扫地出门。

时间: 2024-10-29 22:03:07

立即释放.net下的com组件的相关文章

Android打造通用的下拉刷新组件

还记得上一篇 blog 的内容吗?如果不记得建议先去了解一下,Android 事件处理全面剖析 ,因为下拉刷新需要用到手势的处理,而上一篇文章中,对事件处理做了很详细的说明,了解了事件的处理机制,对理解本篇文章有很大的帮助.好了,这里就当大家都已经对事件处理有了一定的了解,开始我们的下拉刷新征程. 还是老规矩,先上效果图,再根据效果图来分析实现的原理:  一 .分析原理  我们都知道,listView 控件为我们提供了 addHeaderView.和 addFootView 的方法,我们通过此方

一步步教你在Win2003下安装IIS组件

不管是个人用户还是企业用户都会遇到建立网站,发布网页的问题,要知道在Windows操作系统下最有效最常见的发布站点的工具就是IIS了,所以要想建立自己的站点一定要学会安装和使用IIS组件. Windows2003中的IIS组件版本为6,他比Win2000下的IIS更加安全.所以我们有必要学习IIS6的安装.本篇文章将带领大家一起从零开始学习在Windows2003操作系统下安装IIS组件. 第一步:默认情况下IIS6是没有安装在Windows2003系统中的,所以我们需要手动安装这个组件,通过任

如何解决无法释放Mac下删除文件磁盘空间

  如何解决无法释放Mac下删除文件磁盘空间         方法/步骤 首先呢,不知道是不是我这里才遇到:删除文件(之后清理掉Trash)或者用rm -rf直接命令行删除后,磁盘空间不释放. df -h或者用About this Mac看,磁盘空间都没变化.inode节点使用情况也没变化.后来没办法,查来查去,发现根目录下有一个.MobileBackups,占据空间巨大.查文档得知,这是Time Machine的本地备份. 问题是:我已经关闭Time Machine了,但是依然会在这里追加东西

嵌入式-Vxworks支持Windows下的com组件吗?

问题描述 Vxworks支持Windows下的com组件吗? Windows下用ATL编写的COM组件,在Vxworks上可以使用吗? 解决方案 不能支持,com组件只能用在windows上

C# 重写ComboBox实现下拉任意组件的方法_C#教程

一.需求 C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉. 二.设计 基本思路:重写ComboBox,将原生的下拉部分屏蔽,使用toolStripDropDown制作下拉弹出 三.问题解决 1. 问题:toolStripDropDown中放toolStripControlHost时会有边框产生,同时CheckedListBox的duck为full时底端会有很大空白 解决: toolStripControlHos

Jquery Easyui自定义下拉框组件使用详解(21)_jquery

本文实例为大家分享了Jquery Easyui自定义下拉框组件的实现代码,供大家参考,具体内容如下 加载方式 JS调用加载 自定义下拉框不能通过标签的方式进行创建. <input id="box" /> <script> $(function () { //JS 加载调用 $('#box').combo({ required : true, multiple : true, }); }); </script> 属性列表 <script>

jQuery Easyui 下拉树组件combotree_jquery

jQuery EasyUI 组合树(ComboTree) 和组合框的用法差不多,只是在显示上有点差别:一个显示成树状结构,一个显示成列表结构. 项目中做角色授权时,需要做一个下拉框带树结构的 并且可以多选的组件,就想到了easyui的combotree,有关这个组件的用法废话不多说,直接上代码 $('#bianhao').combotree({ url : urlg2 + '/tbdefaultroll/selectByLevel?belongLevel=' + $('#jibie').comb

电商时代经销商:切换电商模式基因,释放线下营销功力

2014 年春节刚过,陈仕又义无反顾的参加电商圈的聚会,为此他推掉了周三的公司例会.「对我来说,现在最重要的是找准方向,五年后我还能做什么?」陈仕,一名从事传统服装十年的经销商,在北京代理了 5 个品牌,运营 60 多家商场专柜和门店,年销售规模近 2 亿元;2008 年开始关注电商,但只是简单地尝试.近两年,他的全盘营业额已经开始停滞不前,计划关闭几十家亏损店铺,还要放弃两个发展不力的品牌.作为一名传统经销商,陈仕开始困惑:未来在哪儿? 也是在 2008 年,杨晓含和丈夫重新规划了二人的分工:

Windows 2003下不注册组件用ASP发邮件

window|发邮件|注册组件 其实ASP可以做很多事,只是大家不知道怎么用而以.微软为asp提供了非常多的现成有用的组件,而这些组件却没有人知道,如用CDO.Message发送邮件. 什么是CDO.Message?在winnt和win2k下发送邮件要用CDONTS.NewMail,CDONTS.NewMail组件是需要注册的,很简单,只要在服务器上运行命令行regsvr32Cdonts.dll,在弹出的对话框中确定即可,使用CDONTS.NewMail服务还需安装有iis自带的smtp.到了w