调试COM对象析构函数时出现奇怪的崩溃

时间:2011-08-22 13:38:38

标签: c# c++ visual-studio-2010 com

我的应用程序是C#和C ++代码的混合体。用C#编写的启动模块在初始化阶段C ++模块中通过COM(组件对象模型)机制加载。一切正常,直到我决定添加到C#部分wcf服务。所有wcf服务调用都使用COM路由到C ++代码。添加一些新方法后,我注意到输出窗口中存在内存泄漏。所以我从截图中可以看到断点到C ++类的析构函数。从这一点开始,奇怪的事情就开始发生了。程序到达断点后意外崩溃。第一个奇怪的事情是,当我运行没有设置断点的程序时,它会慷慨地结束。第二个奇怪的事情是程序崩溃的方式就像它没有调试器一样运行。单击“在调试器中打开”按钮(或类似的东西)后,我收到错误消息:“程序已在调试器下打开。”输出窗口中没有消息可以指向错误的来源,没有可疑代码。 当向析构函数添加消息框时,它会显示小数秒,然后整个应用程序关闭(不添加用户机会来读取消息框中显示的内容)。拼命寻找任何线索。

P.S。只有在至少调用一次wcf方法时才会出现问题。不依赖于此特定调用中的程序流是否路由到C ++级别。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

从C ++调用C#时,有时在程序结束前没有正确调用垃圾收集器。尝试在C#代码的末尾强制进行垃圾回收。

答案 1 :(得分:0)

通过以下代码解决:

public void Dispose()
{
    Marshal.Release(internal_interface_ptr);
    internal_interface_ptr = IntPtr.Zero;
    Marshal.ReleaseComObject(internal_interface);
    Marshal.ReleaseComObject(internal_interface);
    internal_interface = null;
} 

除此之外,还有一个参考文献挂在C ++代码中。因此,为了得出结论,我的主要错误是忘记在C#代码中明确释放COM对象。即使垃圾收集器承担管理内存的任务,对于用其他编程语言编写的模块也是如此。当特定的动态链接库从内存中卸载时,最近会调用COM析构函数,这会导致问题。希望我能清楚地解释它。