为什么使用FinalReleaseComObject代替ReleaseComObject?

问题描述 投票:33回答:1

[我知道基本差,因为ReleaseComObject仅将某个计数器减少1,而FinalReleaseComObject将其减少到零。

所以我通常听到的是,调用FinalReleaseComObject,因为这样您就可以确定COM对象确实已释放。

但是这让我感到奇怪,这个柜台有意思吗?如果始终调用FinalReleaseComObject,就不会破坏该机制。如果在致电ReleaseComObject之前该计数器不是one,可能没有理由吗?

什么时候导致它不应该高于一个?

提前感谢。

PS:我的COM经验仅包括使用Excel Interop。不确定此问题是否在该域本地(例如,在Office Interop外部,FinalReleaseComObject很少使用)。

更新1

[Dan提到的article当您完成后谈论使用ReleaseComObject。据我从article了解,这是正常的方式。我认为,如果您始终如一地执行此操作,则效果会很好。在对article的评论中,作者建议有人循环调用ReleaseComObject直到其真正发布(article是2006年以来的,所以这类似于调用FinalReleaseComObject)。但他还指出,这可能很危险。

如果您确实希望RCW在代码中的特定点调用Release(),则可以循环调用ReleaseComObject(),直到返回值达到零为止。这应该确保RCW将调用Release()。但是,如果执行此操作,请注意,当其他托管引用尝试使用该RCW时,它将导致异常。“

这使我相信始终调用FinalReleaseComObject确实是一个好主意,因为您可能在其他地方引起异常。正如我现在所看到的,只有在绝对确定可以的情况下,才应调用此函数。仍然,我对此事经验不足。我不知道如何确定。如果在不应该增加计数器的情况下,解决该问题是否更好?如果是这样,那么我会说FinalReleaseComObject不仅仅是一种技巧,而不是最佳实践。

我知道基本的区别,因为ReleaseComObject仅将某个计数器减少一,而FinalReleaseComObject将其减少到零。所以我通常听到的是,调用FinalReleaseComObject,因为然后...

.net com interop
1个回答
36
投票
一些前言...
© www.soinside.com 2019 - 2024. All rights reserved.