众所周知,在.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对象,就被扫地出门。

转载于:https://www.cnblogs.com/jjstar/archive/2004/11/08/61316.html

立即释放.net下的com组件相关推荐

  1. 自绘制HT For Web ComboBox下拉框组件

    传统的HTML5的下拉框select只能实现简单的文字下拉列表,而HT for Web通用组件中ComboBox不仅能够实现传统HTML5下拉框效果,而且可以在文本框和下拉列表中添加自定义的小图标,让 ...

  2. android下拉刷新动画效果代码_vue项目实录:下拉刷新组件的开发及slot的使用

    "下拉刷新"和"上滑加载更多"功能在前端.尤其是移动端项目中非常重要,这里笔者由曾经做过的vue项目中的"blink"功能和各位探讨下[下拉 ...

  3. Google官方下拉刷新组件---SwipeRefreshLayout

    今天在Google+上看到了SwipeRefreshLayout这个名词,遂搜索了下,发现竟然是刚刚google更新sdk新增加的一个widget,于是赶紧抢先体验学习下. SwipeRefreshL ...

  4. swift添加下拉刷新_React Native自定义下拉刷新组件

    React Native 自定义下拉刷新组件 PullToRefresh 针对猴急一些的同学,可以先在这个 Expo网站在线运行下demo看看效果 . 完整的代码,在 Github仓库 . 下拉刷新, ...

  5. 微信小程序下拉框插件_微信小程序下拉框组件使用方法详解

    本文实例为大家分享了微信小程序下拉框组件的使用方法,供大家参考,具体内容如下 适用场景 1.省市三级联动 2.出生日期选择 3.性别选择 4.一般性的下拉选择等 一.省市三级联动使用 注意mode = ...

  6. 下拉框的value值怎么设置为变量_自绘制HT For Web ComboBox下拉框组件

    传统的HTML5的下拉框select只能实现简单的文字下拉列表,而HT for Web通用组件中ComboBox不仅能够实现传统HTML5下拉框效果,而且可以在文本框和下拉列表中添加自定义的小图标,让 ...

  7. [html] 说下你对组件、模块、元素的理解,它们的区别在哪里?

    [html] 说下你对组件.模块.元素的理解,它们的区别在哪里? 元素:元素是网页的一部分,在 XML 和 HTML 中,一个元素可以包含一个数据详情或者是一块文本或者是一张照片,亦或是什么也不包含. ...

  8. Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

    bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore ...

  9. Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...

    1 <script> 2 export default { 3 props: ["lists"], 4 data() { 5 return { 6 isactive: ...

  10. MUI下拉导航组件 - 应用篇

    MUI下拉导航组件 - 看效果图 注意: 滚动监听,自动获取Y轴滚动高度,始终定位(下拉菜单高度)于页眉底部: 代码待优化点:(下拉菜单的fixed,仍会随页面滚动而滚动). 效果图 全部代码: &l ...

最新文章

  1. 有关容器的六大误区和八大正确场景
  2. 乐观锁 -业务判断 解决高并发问题
  3. 《HTML 5与CSS 3 权威指南(第3版·上册)》——3.2 新增的非主体结构元素
  4. 说几个著名的死循环:
  5. java 线程执行完就会回收吗_Java线程池技术Executors的这个坑你踩过吗?
  6. Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用
  7. getbook netty实战_Netty 入门教程
  8. SpringBoot-动力节点-王鹤
  9. 如何清理qt源码_Qt+FFmpeg本地录制音频
  10. 开课吧python小课学了有用吗-和年薪百万的CFO大佬聊天后,我慌了!
  11. Sicily 6271
  12. 系列学习 Swagger 之第 2 篇 —— SpringCloud Gateway 整合 Swagger(完结)
  13. c语言中个各标点符号作用,C语言运算符和标点符号.xls
  14. python之路day3_python之路:day3
  15. 残差(residual)
  16. CreateEvent
  17. 2021年T电梯修理考试及T电梯修理考试总结
  18. 如何确保按时交付项目? 有哪些实用方法
  19. H265网页视频播放器播放H265编码录像视频文件如何减缓卡顿情况?
  20. 从HTML文件中抽取正文的简单方案

热门文章

  1. MySql - 事务 | 锁
  2. runTime动态给类添加属性
  3. 【总结】Unity游戏优化
  4. 动态插入图片到 svg 中
  5. hdu1385 最短路字典序
  6. 关于ArrayList和Vector区别
  7. math ceil函数python_Python3 ceil() 函数
  8. 常用chrome插件常用FireFox插件
  9. 关于Google Instant 你必须知道的6件事情,互联网营销
  10. 如何实现 java 接口中的部分方法