В случае закрытия приложения вам ничего не нужно делать, чтобы правильно утилизировать WindowsFormsHost. Так как это происходит из HwndHost, утилизация обрабатывается, когда Диспетчер выключен. Если вы используете Reflector, вы увидите, что при инициализации HwndHost создается WeakEventDispatcherShutdown.
Если вы используете его в диалоге, лучшее, что я могу предложить, - это переопределить OnClosed и утилизировать ваш хост, в противном случае HwndHost будет зависать до тех пор, пока Dispatcher не будет остановлен.
public partial class Dialog : Window
{
public Dialog()
{
InitializeComponent();
}
protected override void OnClosed(EventArgs e)
{
if (host != null)
host.Dispose();
base.OnClosed(e);
}
}
Простой способ проверить, когда вызывается утилита dispose, - это извлечь собственный класс из WindowsFormsHost и поэкспериментировать с различными ситуациями. Поместите точку останова в утилизацию и посмотрите, когда она будет вызвана.
public class CustomWindowsFormsHost : WindowsFormsHost
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}