0

如果特定条件失败或对象部分构造,我能否知道如何从 C# .NET 强制解除分配 COM 服务器对象?

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

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

if( !obj.CanBeUsed() ) { //如何释放 COM 对象 objApp }

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

4

2 回答 2

2

像这样:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);
于 2010-10-21T11:37:46.873 回答
1

你应该试试Marshal.FinalReleaseComObject方法。

FinalReleaseComObject 方法释放对 COM 对象的托管引用。调用该方法相当于循环调用 ReleaseComObject 方法,直到返回 0(零)。

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

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

于 2010-10-21T11:38:37.940 回答