如何正确的释放Interop reference是一个有趣的问题,有时候会让程序运行的莫名其妙。基本上,我们在.Net中访问的每一个COM对象都有一个称为RCW (Runtime Callable Wrapper))的包装。一个RCW对应一个COM实例,其是分配在managed heap上的一种轻量级对象,然而它所包装的对象确是分配在native heap上的。RCW对象同样有一个名为refCount的属性来控制生命周期,一旦数值变为0,RCW对象将不再可以访问,并且其包装的COM对象也会被释放。这种情况下的非法访问会扔出异常,“COM object that has been separated from its underlying RCW cannot be used.”
使用System.Runtime.InteropServices.Marshal.ReleaseComObject(object)可以手动的将RCW的计数引用减1,当有新的client引用RCW对象时,引用计数会自动加1。.Net的垃圾回收也会自动的将不用的RCW计数减1,但往往不受控制,难以跟踪。
CodeProject上有一个文章描写了具体的例子
http://www.codeproject.com/Articles/49750/Office-Interop-Object-Collection-Technique-The-rig.aspx