2013-04-12 32 views
0

我有一个遗留的COM组件,我试图从.NET窗体应用程序中使用它。我使用aximp.exe为非托管COM组件创建.NET包装。然后我使用ISupportInitialize接口的BeginInitEndInit来创建COM类的一个实例。这工作正常。但是当我尝试使用Marshal.ReleaseComObject销毁对象时,未托管的C++ COM对象的析构函数没有被调用。我也试过Marshal.FinalReleaseComObject,但仍然没有调用析构函数。有人可以告诉我什么是正确的方法吗?销毁.NET应用程序中的COM对象

+0

这可能意味着您有其他优秀的对象引用。你确定没有吗? –

+0

谢谢..但我如何找到其他参考? – Asha

+0

如果你拥有COM对象的实现(并且我猜你有你的系统,那么析构函数从未被调用过),你可以监视AddRef/Release调用和引用计数。 –

回答

0

包装将执行IDispose

WinForm类通常有一个组件集合和一个处理组件的Dispose方法。您可以将对象添加到组件集合中,并将它与表单一起处理。 (你甚至可以让窗体设计器为您生成的所有代码。)

如果你想早做,只是调用对象Dispose(如在finally块或者隐含通过using语句)。

+0

我只从Dispose调用FinalReleaseCOMObject。 。我手动调用从我的WinForm应用程序Dispos – Asha

+0

你应该让aximp.exe和系统。它生成的System.Windows.Forms.AxHost派生包装为你工作。如果你使用的是Visual Studio或者equiv,让WinForm设计器为你的组件的生命周期生成代码。就像向COM对象添加项目引用一样简单,将控件添加到WinForms工具箱并将其拖到窗体。这种方式更易于维护。如果您有特殊情况,请先尝试这种方式,然后开发您的特殊情况。 –