从 .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
接口的BeginInit
和EndInit
来创建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 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何从 .NET 对 .NET 中定义的 COM 对象执行后期绑定调用(通过 DispID)?