何时使用ReleaseComObject与FinalReleaseComObject?

时间:2010-10-14 20:16:54

标签: c# com marshalling

我应该何时使用Marshal.FinalReleaseComObject vs Marshal.ReleaseComObject

使用Marshal.FinalReleaseComObject是否存在任何危险?

1 个答案:

答案 0 :(得分:23)

FinalReleaseComObject中有一些优点,它会让您的程序更快崩溃。 “已经与其底层RCW分离的COM对象无法使用”是CLR告诉您自己处理COM引用计数而不是将其留在CLR上是一个错误。您的里程可能会有所不同,当您在开发机器上工作时,您无法真正信任它。将代码部署到客户的计算机时,请确保实施良好的错误报告。

唯一的好处就是你的代码中只有一个地方出错了FinalReleaseComObject。使用ReleaseComObject时会变得更加模糊。因为在CLR调用最终IUnknown::Release()(破坏对象的那个)时崩溃你的程序会暂时不会被检测到。与错误的ReleaseComObject电话相差甚远。但那是世界末日的情景,更有可能的结果是这个电话没有任何差别,因为你错过了那些艰难的电话。与mumble["foo"]一样,索引器引用非常难以被使用。

嗯,我的建议很明显:不要这样做。您正在与从不错误的机器竞争。这样做只是有点慢。一个非常好的“来自现实生活的报告”是available here。 “沉默的刺客”部分是最相关的。

如果让COM服务器立即退出是绝对必要的,那么让机器负责将所有引用计数设置为0.您可以使用GC.Collect()执行此操作。但请记住,如果您希望在调试时也能正常工作,则必须正确放置该调用。它不适用于使用COM对象的相同方法,在this answer中有说明。把它放在调用方法中。