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

调试COM对象析构函数时发生奇怪的崩溃 我的应用程序是C和C++代码的混合。初始化模块在C阶段加载,在初始化阶段C++模块中通过COM(组件对象模型)机制。在我决定添加到C#part a wcf服务之前,一切都正常运行。所有WCF服务调用都使用COM路由到C++代码。添加一些新方法后,我注意到输出窗口中存在内存泄漏。所以我把断点添加到C++类的下拉器中,从屏幕截图中可以看到。从这一点上,奇怪的事情开始发生。程序到达断点后意外崩溃。第一件奇怪的事情是,当我运行程序时,并没有设置断点,它会优雅地结束。第二件奇怪的事情是,程序崩溃的方式就像它在没有调试器的情况下运行一样。单击按钮“在调试器中打开”(或类似的内容)后,我得到错误消息:“程序已在调试器下打开。”输出窗口中没有任何消息可以指向错误源,也没有可疑代码。 当将消息框添加到析构函数开始时,它会显示几秒钟,然后整个应用程序关闭(不增加用户读取消息框中显示内容的机会)。拼命寻找任何线索,c#,c++,visual-studio-2010,com,C#,C++,Visual Studio 2010,Com,仅当至少调用一次wcf方法时,才会出现p.S.问题。不依赖于这个特定调用中的程序流是否被路由到C++级别。 < P>从C++调用C.*时,垃圾收集器在程序结束前调用不正确。尝试在C代码末尾强制垃圾收集。通过以下代码解决: public void Dispose() { Marshal.Release(internal_interface_ptr); internal_interface_ptr = IntPtr.Zero; Marshal.ReleaseComObje

仅当至少调用一次wcf方法时,才会出现p.S.问题。不依赖于这个特定调用中的程序流是否被路由到C++级别。


< P>从C++调用C.*时,垃圾收集器在程序结束前调用不正确。尝试在C代码末尾强制垃圾收集。

通过以下代码解决:

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析构函数是最近从内存中卸载特定的动态链接库时调用的,这导致了问题。希望我解释得足够清楚。

崩溃就像奇迹消失一样,然而程序在所有COM析构函数完成工作之前就结束了。看我的第二张截图。此时,程序即将结束,但一些COM析构函数尚未调用。调用它们后,它们的工作突然完成。通过以下代码解决:public void Dispose(){Marshal.Release(internal_interface_ptr);internal_interface_ptr=IntPtr.Zero;Marshal.ReleaseComObject(internal_interface);internal_interface=null;}我不太清楚你所说的“像奇迹消失一样崩溃”是什么意思。我认为您可能需要在致电garbase collector之前强制处理您的服务。检查以确保在garbase collector运行之前释放ServicesToRun或services,否则运行对您没有好处。部分问题是我忘记在C#代码中显式释放COM对象。也许我还有另外一个问题,因为对COM对象的一个引用仍然存在。在我的例子中调用GC.Collect()是不必要的。见我对这个问题的回答。不过,感谢您的建议。请尝试使用WinDbg而不是VS调试器来获取有关崩溃的更多信息