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