如何从C#.NET强制释放COM服务器对象

问题描述:

如果特定condion失败或对象部分构建,我可以知道如何从C#.NET强制释放COM服务器对象吗?如何从C#.NET强制释放COM服务器对象

问题是我使用的COM服务器使用DCOM机制;在最坏的情况下,当对象没有完全创建,并且自从失败后出现应用程序时,COM对象仍在内存中(显示在COM +应用程序组件服务中)。如果超出某些限制,会导致内存泄漏和崩溃。但是,如果它的可管理的失败数量,在某个时间点之后它会被删除。示例: - Calculator.App objApp = new Calculator.App();

如果 {// 如何解除分配COM对象objApp }

注(obj.CanBeUsed()!): 有一个方法,所以GC.Collect()由Garbase收集用于去从堆内存强制分配。我是否可以使用这种方法或.NET franework为这种特殊情况提供任何其他解决方案?

+0

感谢您对此的评论,Aamir。我将来会继续努力。我没有意识到这一点,再次感谢。 – 2010-10-21 11:49:34

像这样:

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

有一个MSDN博客说使用ReleaseComObject()是非常危险的。 http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx。你有什么观点? – 2010-10-21 11:54:11

+1

你谈到强制释放对象,对吧?每当你将强有力地做一些事情,会有副作用:) – Aamir 2010-10-21 12:28:02

+0

这里副作用不应该发生:(我将用于避免内存泄漏只,以帮助.NET框架:)。 – 2010-10-21 13:17:31

你应该尝试Marshal.FinalReleaseComObject方法。

FinalReleaseComObject方法 释放管理参考到一个 COM对象。调用此方法为 相当于在循环 中调用 ReleaseComObject方法,直到它返回0(零)。

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

COM对象在其 已从其基础 RCW中分离后无法使用。如果您尝试调用 上的方法,则其引用计数为 后的RCW将变为0,则会抛出InvalidComObjectException 。

+0

这有点危险。从MSDN:“通过将其引用计数设置为0,释放对运行时可调用包装程序(RCW)的所有引用。”这意味着它会尝试强制将引用计数设置为0,这可能很糟糕,因为可能还有其他有效的引用。 – Aamir 2010-10-21 11:41:30

+0

@Aamir:我认为强制释放是重点。 – 2010-10-21 11:43:55

+0

有一个MSDN博客说使用ReleaseComObject()是非常危险的。 http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx。 – 2010-10-21 11:53:46