何时使用ReleaseComObject vs FinalReleaseComObject?

什么时候应该使用Marshal.FinalReleaseComObject vs Marshal.ReleaseComObject

使用Marshal.FinalReleaseComObject有没有危险?

FinalReleaseComObject有一些优点,它会让程序更快崩溃。 “与其底层RCW分离的COM对象不能被使用”是CLR告诉你,你正在处理COM引用而不是把它留给CLR是一个错误。 你的里程可能会有所不同,当你在开发机器上工作时,你不能真正相信它是正确的。 确保在将代码部署到客户机器时实施出色的错误报告。

优点是你的代码中只有一个地方,你错了, FinalReleaseComObject调用。 当你使用ReleaseComObject的时候会变得很模糊。 因为这会在一段时间内不被发现,当CLR调用最后的IUnknown::Release()时,会崩溃你的程序,这是破坏对象的那个。 离不正确的ReleaseComObject调用很远。 但是,这是世界末日的情况,更有可能的结果是,这次电话会议没有什么区别,因为你错过了困难的时刻。 就像mumble["foo"] ,索引参考是非常难以看到被使用。

那么,我的build议是显而易见的:不要这样做。 你正在与一台永远不会错的机器竞争。 这样做只是有点慢。 这里有一个非常好的“现实生活报告”。 “无声的刺客”部分是最相关的。

如果让COM服务器立即退出是绝对必要的,那么让机器负责让所有的引用计数为0。你用GC.Collect()这样做。 但请记住,如果您希望在debugging时也能正常工作,则必须正确地调用该调用。 它不会在使用COM对象的相同方法中工作,在这个答案中解释。 把它放在调用方法中。