Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从.NET应用程序中销毁COM对象_C#_C++_.net_Com - Fatal编程技术网

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

C# 从.NET应用程序中销毁COM对象,c#,c++,.net,com,C#,C++,.net,Com,我有一个旧的COM组件,我正试图从.NET windows窗体应用程序中使用它。我使用aximp.exe为非托管COM组件创建.NET包装。然后我使用ISupportInitialize接口的BeginInit和EndInit创建COM类的实例。这很好用。但是,当我试图用 MARHAL.RelaseCeObjs< /C>破坏对象时,未托管的C++ COM对象的析构函数没有被调用。我也尝试了封送.FinalReleaseComObject,但仍然没有调用析构函数。谁能告诉我正确的方法是什么吗?包装

我有一个旧的COM组件,我正试图从.NET windows窗体应用程序中使用它。我使用
aximp.exe
为非托管COM组件创建.NET包装。然后我使用
ISupportInitialize
接口的
BeginInit
EndInit
创建COM类的实例。这很好用。但是,当我试图用<代码> MARHAL.RelaseCeObjs< /C>破坏对象时,未托管的C++ COM对象的析构函数没有被调用。我也尝试了
封送.FinalReleaseComObject
,但仍然没有调用析构函数。谁能告诉我正确的方法是什么吗?

包装器将实现
IDispose

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


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

我仅从Dispose调用FinalReleaseCOMObject。我正在从winform应用程序手动调用Dispose,您应该让aximp.exe和系统运行。它生成的System.Windows.Forms.AxHost派生的包装器可以为您完成这项工作。如果您使用的是Visual Studio或equiv,请让WinForm设计器为组件的生命周期生成代码。只需将项目引用添加到COM对象,将控件添加到WinForms工具箱,然后将其拖动到表单中即可。这样会更易于维护。如果你有一个特例,那么先试试这种方法,然后开发你的特例。这可能意味着你还有其他对这个对象的突出引用。你确定没有吗?谢谢。。但是我如何找到其他引用呢?如果您拥有COM对象的实现(我猜您的sys中没有调用析构函数),那么您可以监视AddRef/Release调用和引用计数。