我正在使用一个WPF应用程序,该应用程序使用System.AddIn来解决我们使用WindowsFormsHost控件中包含的基于Windows窗体的控件所遇到的内存泄漏问题。该加载项用于根据需要加载和卸载基于Windows窗体的控件,以避免WindowsFormsHost的开销,它将在当前版本的WPF中关闭应用程序并且基于Windows窗体的控件中的内存泄漏糟糕的清理逻辑。
我们面临的问题是,在应用程序中加载和卸载加载项后,WPF应用程序将在应用程序退出时抛出“无效窗口句柄”的Win32异常。这通常不是一个可怕的问题,但即使有可能捕获异常,它也不会阻止Windows看到应用程序崩溃并在Windows 7下显示崩溃对话框,这是不可接受的。
关于代码,相关事实是:
仅当WPF主机应用程序加载和卸载加载项时才会发生异常。我们在加载项中处理WindowsFormsHost控件和基于Windows窗体的控件,作为卸载加载项之前调用的自定义Dispose方法的一部分。
加载项在卸载之前关闭其Dispatchers(作为上述处理过程的一部分),这已在MSDN文档和博客文章中注明,并且还要解决此问题,但尚未发生在这种情况下。
我们别无选择使用基于Windows窗体的控件,因为某些报表需要它,并且转换的报表文件太多而且没有合适的WPF版本,也没时间将其更改。
我无法提供代码示例,所以如果我错过了某些内容,我会在任何想法或之前的经历中找到答案。
答案 0 :(得分:2)
我有一个类似的问题回来了。我看到我在主窗口的Dispatcher.InvokeShutdown
事件处理程序中调用Window_Closing
(在测试控件的内容不为空之后),并且似乎记得它是解决方案。