我正在开发一个 WPF 应用程序,该应用程序使用 System.AddIn 来解决我们在使用包装在 WindowsFormsHost 控件中的基于 Windows 窗体的控件时遇到的内存泄漏问题。该加载项用于根据需要加载和卸载基于 Windows 窗体的控件,以避免 WindowsFormsHost 的开销,在当前版本的 WPF 和基于 Windows 窗体的控件中的内存泄漏之前,WindowsFormsHost 的开销将一直存在,因为糟糕的清理逻辑。
我们面临的问题是,在应用程序中加载和卸载外接程序后,WPF 应用程序将在应用程序退出时抛出“无效窗口句柄”的 Win32 异常。这通常不是一个可怕的问题,但是即使可以捕获异常,它也不会阻止 Windows 将应用程序视为崩溃并在 Windows 7 下显示崩溃对话框,这是不可接受的。
关于代码,相关事实是:
仅当 WPF 宿主应用程序加载和卸载加载项时才会发生异常。我们将在加载项中释放 WindowsFormsHost 控件和基于 Windows 窗体的控件,作为在卸载加载项之前调用的自定义 Dispose 方法的一部分。
加载项在卸载之前关闭其调度程序(作为上述处置过程的一部分),这已在 MSDN 文档和博客文章中指出是必需的,并且还解决了在这种情况下未发生的问题。
我们没有选择使用基于 Windows 窗体的控件,因为它是一些报告所必需的,并且有太多的报告文件需要转换,没有合适的 WPF 版本,也没有时间去改变它。
我无法提供代码示例,因此我正在寻求有关这种情况的任何想法或以前的经验,以防我遗漏了什么。