使用CEFSharp WPF进行Chromium Embedded互操作ActiveX控件的内存泄漏

时间:2014-03-17 13:21:12

标签: .net wpf vb6 com-interop chromium

不久前,我发布了this thread关于为CEFSharp WPF表单创建COM Interop包装器作为Internet Explorer ActiveX控件的替代方法。我们当时最终不需要使用它,但它开始看起来像我们需要再次使用它。无论如何,自从我上次发布以来,我已经成功地完成了所有工作,并为Web控件创建了一个安装包 - 遗憾的是,它似乎有内存泄漏。好消息是,我想我知道发生了什么,然而坏消息是,我所尝试过的任何事情似乎都无法解决。

该项目有一个类 WebControl ,它继承了 System.Windows.Forms.Integration.ElementHost ,并为 CEFSharp.WPF提供了一个私有变量.WebView 即可。该类包括Interop Forms Toolkit中的所有VB6 Interop代码(所有COM注册,属性,事件和方法)。它还有一个公共的Navigate方法,它调用适当的CEFSharp Load方法。

所以,这是有趣的部分:控件的类构造函数初始化 CEFSharp.WPF.WebView 。这意味着WebView在设计时中在VB6中实例化 - 当控件添加到父窗体时 - 而不是在运行时 - 加载或显示窗体时。更糟糕的是,我可以设置一个WndProc方法来处理 WM_DESTROY 并关闭托管的WPF元素,但是当你关闭设计器或卸载表单时会调用 WM_DESTROY ,这意味着当您重新加载父窗体时,基础 CEFSharp.Wpf.WebView 不再存在。这个问题的症结似乎是我没有办法在表单加载时初始化控件,因为表单是VB6项目中消耗控件的一部分;除非你在VB6中运行时动态添加控件而不是使用设计器,我想。

无论如何,如果有人对如何以不同的方式解决这个问题或想法,我很乐意听到它。我考虑将该项目作为一个开源替代COM ActiveX控件发布,但我不确定利益将如何利用 - 从技术上讲,它似乎走向了错误的方向。

0 个答案:

没有答案