伙计们-我在.net中创建了许多COM服务器(我正在启动许多EXE),通过COM-interop与COM对话,在服务器中使用许多COM对象等。如果我终止进程,有什么危害吗?不释放我通过 Marshal.FinalReleaseComObject() 使用的所有 COM 对象有什么不好的吗?随着时间的推移,我会出现内存泄漏吗?
问问题
211 次
1 回答
3
我假设您在谈论进程外 COM 服务器,尽管它们远不如进程内服务器常见。杀死客户端应用程序是不好的,服务器永远不会获得释放调用,客户端分配的任何对象的资源将一直使用,直到 EXE 终止。杀死服务器应用程序将使客户端应用程序因 RPC 错误而失败,不会泄露任何内容。
不使用 Marshal.FinalReleaseComObject() 并没有什么不好,COM 对象引用计数由 RCW(运行时可调用包装器)管理。它与 .NET 编程中的任何其他对象一样是托管对象,垃圾收集器负责处理它。当终结器运行时,引用计数递减。当这种情况发生时,它是不可预测的。
使用 Final/ReleaseComObject() 可以使其可预测,但您必须在创建的每个对象上调用它。这可能很困难,例如,在使用索引器时创建一个并不总是很明显。这也是危险的,错误的调用时间或没有正确跟踪对对象的所有引用会导致臭名昭著的“无法使用已与其底层 RCW 分离的 COM 对象”异常。这里有一个很好的战争故事。
于 2011-03-10T05:57:52.750 回答