何时使用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对象的相同方法中工作,在这个答案中解释。 把它放在调用方法中。