如何从 C# .NET 强制解除分配 COM 服务器对象

Posted

技术标签:

【中文标题】如何从 C# .NET 强制解除分配 COM 服务器对象【英文标题】:How to deallocate COM server object forcefully from C# .NET 【发布时间】:2010-10-21 11:36:42 【问题描述】:

如果特定条件失败或对象被部分构造,我能否知道?

问题是我正在使用使用 DCOM 机制的 COM 服务器;在最坏的情况下,当对象没有完全创建并且我因为失败而退出应用程序时,COM 对象仍在内存中(显示在 COM+ 应用程序组件服务中)。如果超出某些限制,则会导致内存泄漏和崩溃。但如果它的故障数量在可控范围内,它会在某个时间点后被删除。

示例:- Calculator.App objApp = new Calculator.App();

如果(!obj.CanBeUsed()) //如何释放COM对象objApp

注意: Garbase Collector 使用一种方法 GC.Collect() 强制从堆内存中取消分配。我是否可以使用这种方法或 .NET 框架为这种特殊情况提供任何其他解决方案?

【问题讨论】:

感谢您对此的评论,阿米尔。我将在未来努力。我不知道,再次感谢。 【参考方案1】:

像这样:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);

【讨论】:

有一个 MSDN 博客说使用 ReleaseComObject() 非常危险。 blogs.msdn.com/b/visualstudio/archive/2010/03/01/…。您对此有何看法? 你说的是强制释放对象吧?每当你强行做某事时,都会有副作用:) 这里的副作用不应该发生 :(。我将仅用于避免内存泄漏,以帮助 .NET 框架:)。【参考方案2】:

你应该试试Marshal.FinalReleaseComObject 方法。

FinalReleaseComObject 方法 释放对 a 的托管引用 COM 对象。调用这个方法是 相当于调用 循环中的 ReleaseComObject 方法 直到它返回 0(零)。

当 COM 上的引用计数 对象变为 0,COM 对象为 通常被释放,尽管这取决于 关于 COM 对象的实现和 超出了运行时的控制。 但是,RCW仍然可以存在, 等待被垃圾收集。

COM 对象在它之后不能使用 已与其底层资产分离 RCW。如果您尝试调用一个方法 引用计数后的 RCW 变为 0,一个 InvalidComObjectException 会被抛出。

【讨论】:

这有点危险。来自 MSDN:“通过将其引用计数设置为 0,释放对运行时可调用包装器 (RCW) 的所有引用。”这意味着它将尝试强制将引用计数设置为 0,这可能很糟糕,因为可能还有其他有效引用。 有一个 MSDN 博客说使用 ReleaseComObject() 非常危险。 blogs.msdn.com/b/visualstudio/archive/2010/03/01/….

以上是关于如何从 C# .NET 强制解除分配 COM 服务器对象的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit 没有回调/解除分配? (阿拉莫菲尔)

如何解除分配 CCLayer

如何从 C# WebSocket4net 调用服务器事件(nodejs socket.io)

如何强制 C# .net 应用程序在 Windows 中仅运行一个实例? [复制]

当任何数学运算在 .net 4 中产生“NaN”时,如何强制 C# 编译器抛出异常?

强制向操作系统释放内存