从 .NET 应用程序中销毁 COM 对象

Posted

技术标签:

【中文标题】从 .NET 应用程序中销毁 COM 对象【英文标题】:Destroying a COM object from .NET application 【发布时间】:2013-04-12 05:29:33 【问题描述】:

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

【问题讨论】:

这可能意味着您对该对象还有其他未完成的引用。你确定没有吗? 谢谢.. 但是我如何找到其他参考资料? 如果你拥有 COM 对象的实现(我猜你有你的系统,析构函数永远不会被调用),你可以监控 AddRef/Release 调用和引用计数。 【参考方案1】:

包装器将实现IDispose

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

如果您想更早执行此操作,只需在对象上调用Dispose(例如在finally 块中或通过using 语句隐式调用)。

【讨论】:

我只从 Dispose 调用 FinalReleaseCOMObject 。 .我正在从我的 winform 应用程序手动调用 Dispose 你应该让aximp.exe和系统。它生成的 System.Windows.Forms.AxHost 派生包装器为您完成工作。如果您使用的是 Visual Studio 或同等产品,请让 WinForm 设计器为组件的生命周期生成代码。就像添加对 COM 对象的项目引用、将控件添加到 WinForms 工具箱并将其拖到您的窗体一样简单。这种方式更易于维护。如果您有特殊情况,请先尝试这种方式,然后再开发您的特殊情况。

以上是关于从 .NET 应用程序中销毁 COM 对象的主要内容,如果未能解决你的问题,请参考以下文章

从使用到原理学习Java线程池

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

如何从 .NET 对 .NET 中定义的 COM 对象执行后期绑定调用(通过 DispID)?

如何销毁.Net中的对象

当指针超出范围时,由 CComObject::CreateInstance 创建的 COM 对象不会被销毁

Java线程池,从使用到原理