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

如何从C#.NET强制解除分配COM服务器对象,c#,.net,asp.net,dcom,C#,.net,Asp.net,Dcom,如果特定条件失败或对象是部分构造的,我可以知道如何从C#.NET强制解除分配COM服务器对象吗 问题是我使用的是使用DCOM机制的COM服务器;在最坏的情况下,当对象没有完全创建,并且由于失败而退出应用程序时,COM对象仍在内存中(显示在COM+应用程序组件服务中)。如果超出某些限制,就会导致内存泄漏和崩溃。但是,如果失败的数量是可控的,那么它会在某个时间点后被删除 样本:- Calculator.App objApp=new Calculator.App() 如果(!obj.CanBeUsed

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

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

样本:- Calculator.App objApp=new Calculator.App()

如果(!obj.CanBeUsed()) { //如何取消分配COM对象objApp }

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

如下所示:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);
像这样:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);
你应该试试这个方法

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

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

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

你应该试试这个方法

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

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

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


这有点危险。来自MSDN:“通过将引用计数设置为0来释放对运行时可调用包装器(RCW)的所有引用。”这意味着它将尝试强制将引用计数设置为0,这可能是错误的,因为可能还有其他有效引用。MSDN博客上说,使用ReleaseComObject()非常危险。这有点危险。来自MSDN:“通过将引用计数设置为0来释放对运行时可调用包装器(RCW)的所有引用。”这意味着它将尝试强制将引用计数设置为0,这可能是错误的,因为可能还有其他有效引用。MSDN博客上说,使用ReleaseComObject()非常危险。谢谢你的评论,阿米尔。我将在将来对此进行研究。我没有意识到这一点,再次感谢。谢谢你的评论,阿米尔。我将在将来对此进行研究。我没有意识到这一点,再次感谢。有一个MSDN博客说使用ReleaseComObject()是非常危险的。你有什么看法吗?你说过要用力释放物体,对吗?无论何时,当您强制执行某项操作时,都会产生副作用:)这里不应该发生副作用:(.我将使用它来避免内存泄漏,以帮助.NET framework:)。有一个MSDN博客说,使用ReleaseComObject()非常危险。你有什么看法吗?你说过要用力释放物体,对吗?无论何时强制执行某项操作,都会产生副作用:)此处不应出现副作用:(.我将仅用于避免内存泄漏,以帮助.NET framework:)。