杀死COM服务器而不释放.net中的com对象有什么害处吗?

时间:2011-03-10 04:50:28

标签: .net com com-interop com-server

伙计 - 我在.net中创建了许多COM服务器(我正在启动众多EXE),通过COM -interop与COM通信,在服务器中使用大量COM对象等。如果我终止进程,是否存在有害吗?没有释放我通过Marshal.FinalReleaseComObject()释放的所有COM对象有什么不好吗?随着时间的推移,我会有内存泄漏吗?

1 个答案:

答案 0 :(得分:3)

我假设您正在讨论进程外COM服务器,尽管它们远不如进程内服务器常见。杀死客户端应用程序很糟糕,服务器永远不会获得释放调用,客户端分配的任何对象的资源将一直使用,直到EXE终止。杀死服务器应用程序将导致客户端应用程序因RPC错误而失败,没有任何泄露。

没有使用Marshal.FinalReleaseComObject()没什么不好,COM对象引用计数由RCW(运行时可调用包装器)管理。它是.NET编程中的任何其他托管对象,垃圾收集器负责处理它。终结器运行时,引用计数递减。这种情况发生时无法预测。

使用Final / ReleaseComObject()可以使其可预测,但您必须在您创建的每个对象上调用它。这可能很困难,例如,在使用索引器时创建一个并不总是显而易见的。这也是危险的,错误的定时调用或没有正确跟踪对象的所有引用导致臭名昭着的“COM对象已经与其底层RCW分离不能使用”异常。一个好的战争故事是available here