tru*_*ker 5 c# c++ com visual-studio-2010
我的应用程序是C#和C++代码的混合.用C#编写的启动模块在初始化阶段C++模块中通过COM(组件对象模型)机制加载.一切正常,直到我决定添加到C#部分wcf服务.所有wcf服务调用都使用COM路由到C++代码.添加一些新方法后,我注意到输出窗口中存在内存泄漏.所以我从截图中可以看到断点到C++类的析构函数.从这一点开始,奇怪的事情就开始发生了.程序到达断点后意外崩溃.第一个奇怪的事情是,当我运行没有设置断点的程序时,它会慷慨地结束.第二个奇怪的事情是程序崩溃的方式就像它没有调试器一样运行.单击"在调试器中打开"按钮(或类似的东西)后,我收到错误消息:"程序已在调试器下打开." 输出窗口中没有消息可以指向错误的来源,没有可疑代码.当向析构函数添加消息框时,它会显示小数秒,然后整个应用程序关闭(不添加用户机会来读取消息框中显示的内容).拼命寻找任何线索.
PS问题仅在至少调用一次wcf方法时发生.不依赖于此特定调用中的程序流是否路由到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;
} 
Run Code Online (Sandbox Code Playgroud)
除此之外,C++ 代码中还挂着另一个引用。总而言之,我的主要错误是忘记在 C# 代码中显式释放 COM 对象。即使垃圾收集器承担管理内存的任务,对于用其他编程语言编写的模块来说也不是这样。最近,当要从内存中卸载特定的动态链接库时,会调用 COM 析构函数,这会导致问题。希望我解释得足够清楚。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           449 次  |  
        
|   最近记录:  |