Interop Object在.Net中的引用计数问题

来源:互联网 发布:apache ant 1.8.4 编辑:程序博客网 时间:2024/06/06 13:22

如何正确的释放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

 

 

原创粉丝点击