You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

释放WindowsFormsHost时出现非托管内存泄漏问题求助

混合WPF/WinForms架构下WindowsFormsHost非托管内存泄漏排查问题

背景

我们正在将一个大型WindowsForms应用重构为WPF应用,因重构周期较长,采用混合架构:新面板使用纯WPF实现,原有WindowsForms元素通过WindowsFormsHost控件托管显示,使用Syncfusion的WPF Docking Manager以标签页形式展示这些页面。

问题现象

打开并关闭近100个包含WindowsFormsHost的页面后,系统出现内存耗尽情况。经JetBrains DotMemory分析,泄漏出现在非托管内存中,且WindowsFormsHost及其子内容看似已被正确释放。

已实施的处理措施

我们参考相关方案进行了以下处理:

  • 将WindowsFormsHost包裹在Grid中,释放时清空Grid:
public override void Dispose()
{
    if (this.Content is Grid grid && grid.Children.Count == 1)
    {
        if (grid.Children[0] is KWFHost wfh)
        {
            wfh.Child.SizeChanged -= ControlSizeChanged;
            wfh.Dispose();
        }

        grid.Children.Clear();
    }

    base.Dispose();
}
  • 自定义继承自WindowsFormsHost的KWFHost类,重写Dispose方法以确保子控件释放:
public class KWFHost : WindowsFormsHost
{
    protected override void Dispose(bool disposing)
    {
        if (this.Child is IDisposable disposable)
        {
            disposable.Dispose();
        }

        this.Child = null;
            
        base.Dispose(true);
    }
}
  • 添加Grid与WindowsFormsHost的代码:
public void SetContent(System.Windows.Forms.Control control)
{
    var host = new KWFHost();
    host.Child = control;
    control.SizeChanged += ControlSizeChanged;

    var grid = new Grid();
    grid.Children.Add(host);

    this.Content = grid;
}

疑问

从内存分配结果来看,我们怀疑托管机制导致了泄漏,希望了解:

  1. WindowsFormsHost是否存在已知问题可解释该非托管内存泄漏现象?
  2. 还有哪些方法可以进一步定位问题根源?

内容的提问来源于stack exchange,提问作者Tom RAVANEL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:31:16