在.Net中, 经常我们会利用Excel来展现数据. 我们知道此时, Excel做为一个进程外COM被激活. 可是却无法彻底关闭该进程. 这是什么原因呢?
COM的生命周期依靠计数机制,只有当引用计数为零时,该COM才会被释放.
.Net程序能调用COM,依赖于RCW(运行库可调用包装)组件,它负责把.Net方法的调用参数转化为COM接口中的参数,并调用相应的COM接口, 然后将返回结果最终返回给.net程序的方法.
因此,当在.Net中操作Excel的方法时,意味着RCW在引用Excel中的对象,所以为了彻底关闭Excel,必须将对于这些对象的引用计数清零.在.Net中提供了Marshal.ReleaseComObject .
为了方便起见,可封装如下方法:
private void NAR(object o)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
}
catch {}
finally
{
o = null;
}
}
由于垃圾回收的原因,CLR并不会立即回收对象.所以为了能够立即回收,那么可以调用GC.Collect()来迫使垃圾回收器起作用.
具体的例子请参考: http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B317109