Han*_*ant 23

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

优点是你的代码中只有一个地方你错了,这个FinalReleaseComObject电话.使用时会变得更加模糊ReleaseComObject.因为这将在一段时间内未检测到,当CLR调用最终版本时会崩溃程序IUnknown::Release(),即破坏对象的程序.离错误的ReleaseComObject电话很远.但那是世界末日的情景,更有可能的结果是这个电话没有任何差别,因为你错过了那些艰难的电话.比如mumble["foo"],索引器引用非常难以被使用.

嗯,我的建议很明显:不要这样做.你正在与一台永远不会出错的机器竞争.这样做只是有点慢.一个很不错的"从现实生活报告"是可以在这里找到."沉默的刺客"部分是最相关的.

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

  • 我删除了所有Marshal类调用,发现代码更稳定,RCW和COM错误更少.+1谢谢!! 我只有他们,因为我正在使用的SAP SDK说他们把... (5认同)
  • 好吧,也许那不是那么清楚.删除所有Marshal类调用.当你发现任何差异时回来. (3认同)
  • @HansPassant的建议(不是tu使用FinalReleaseCOM)也适用于你是PInvoking非托管代码的情况? (3认同)
  • 不,pinvoke与调用COM接口方法无关.Pinvoke使用[DllImport]属性完成,没有与之关联的COM接口指针. (3认同)
  • 你建议不要释放这个物体吗? (2认同)
  • 是.为什么你认为你必须这样做? (2认同)