【问题标题】:"Invalid Window Handle" on exiting of WPF application that uses System.AddIn退出使用 System.AddIn 的 WPF 应用程序时出现“无效的窗口句柄”
【发布时间】:2010-01-13 00:28:35
【问题描述】:

我正在开发一个 WPF 应用程序,该应用程序使用 System.AddIn 来解决我们在使用包装在 WindowsFormsHost 控件中的基于 Windows 窗体的控件时遇到的内存泄漏问题。该加载项用于根据需要加载和卸载基于 Windows 窗体的控件,以避免 WindowsFormsHost 的开销,在当前版本的 WPF 和基于 Windows 窗体的控件中的内存泄漏之前,WindowsFormsHost 的开销将一直存在,因为糟糕的清理逻辑。

我们面临的问题是,在应用程序中加载和卸载外接程序后,WPF 应用程序将在应用程序退出时抛出“无效窗口句柄”的 Win32 异常。这通常不是一个可怕的问题,但是即使可以捕获异常,它也不会阻止 Windows 将应用程序视为崩溃并在 Windows 7 下显示崩溃对话框,这是不可接受的。

关于代码,相关事实是:

  1. 仅当 WPF 宿主应用程序加载和卸载外接程序时才会发生异常。我们将在加载项中释放 WindowsFormsHost 控件和基于 Windows 窗体的控件,作为在卸载加载项之前调用的自定义 Dispose 方法的一部分。

  2. 加载项在卸载之前关闭其调度程序(作为上述处置过程的一部分),这已在 MSDN 文档和博客文章中指出是必需的,并且还解决了这个尚未发生的问题在这种情况下。

  3. 我们没有选择使用基于 Windows 窗体的控件,因为它是某些报告所必需的,而且要转换的报告文件太多,没有合适的 WPF 版本,也没有时间进行更改。

我无法提供代码示例,因此我正在寻求有关此类场景的任何想法或以前的经验,以防我遗漏了什么。

【问题讨论】:

  • 我也遇到过这个问题——很想听听解释。

标签: wpf windowsformshost system.addin


【解决方案1】:

不久前我遇到了类似的问题。我看到我在主窗口的Window_Closing 事件处理程序中调用了Dispatcher.InvokeShutdown(在测试控件的内容不为空之后),并且似乎记得这是解决方案。

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 2014-01-17
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多