我知道基本的区别是ReleaseComObject
只是将某些计数器减一,而FinalReleaseComObject
将其减为零。
所以通常听到的建议是调用FinalReleaseComObject
,因为这样你就可以确信COM对象已经被释放了。
但是这让我想,这个计数器有什么作用呢?如果总是调用FinalReleaseComObject
,那么不会破坏这个机制吗?如果在调用ReleaseComObject
之前该计数器不等于1,那么可能有原因吗?
是什么导致它比应该为1的更高呢?
先谢谢了。
PS:我的COM经验仅限于使用Excel Interop。不确定这个问题是否局限于该领域(即在Office Interop之外,FinalReleaseComObject
并不经常使用)。
更新1
Dan提到的文章讨论了在完成后使用ReleaseComObject
的情况。根据我从文章中的理解,这是正常的方式。我认为如果你一直这样做,它应该能正常工作。在文章的评论中,作者建议某人调用ReleaseComObject
循环,直到它真正被释放(文章是从2006年的,因此类似于调用FinalReleaseComObject
)。但他还指出,这可能是危险的。
如果你希望在代码的特定位置调用RCW的Release()方法,可以使用一个循环来调用ReleaseComObject(),直到返回值为零为止。这样应该确保RCW将会调用Release()。但是,如果这样做,需要注意的是,当其他托管引用尝试使用该RCW时,将会导致异常。
这使我相信,一直调用FinalReleaseComObject并不是一个好主意,因为它可能会在其他地方引起异常。目前看来,只有当你绝对确定时才应该这样做。
然而,我在这方面缺乏经验。我不知道如何确保自己能够做到这一点。如果计数器在不应增加时增加,那么修复问题不是更好吗?如果是这样,那么我认为FinalReleaseComObject更像是一种hack而不是最佳实践。