2010-01-13 4 views
4

Я работаю над приложением WPF, использующим System.AddIn для решения проблемы утечки памяти, которую мы имели с помощью элемента управления Windows Forms, который был завернут в элемент управления WindowsFormsHost. Надстройка используется для загрузки и выгрузки элемента управления на основе Windows Forms, поскольку необходимо избегать накладных расходов на WindowsFormsHost, который будет зависать до закрытия приложения в текущей версии WPF и утечки памяти в элементе управления Windows Forms из-за плохая логика очистки.«Invalid Window Handle» при выходе из приложения WPF, использующего System.AddIn

Проблема, с которой мы сталкиваемся, заключается в том, что после загрузки и выгрузки надстройки в приложении приложение WPF будет вызывать исключение Win32 «Недопустимый дескриптор окна» при выходе приложения. Это, как правило, не представляет собой страшную проблему, однако, несмотря на то, что можно поймать исключение, это не помешает Windows увидеть, как приложение разбилось и отобразило диалоговое окно сбоя под Windows 7, и это неприемлемо.

В отношении кода соответствующие факты:

  1. Исключение происходит только, если загружена надстройка и выгружается хост-приложением WPF. Мы удаляем элемент управления WindowsFormsHost и элемент управления Windows Forms в надстройке как часть пользовательского метода Dispose, который вызывается перед выгрузкой надстройки.

  2. Надстройка закрывает своих диспетчеров до выгрузки (как часть вышеописанного процесса удаления), которые были отмечены в документации MSDN и сообщениях в блоге, которые необходимы, а также для решения этой проблемы, которая не произошла в Это дело.

  3. У нас нет выбора в использовании элемента управления на основе Windows Forms, как это требуется для некоторых отчетов, и слишком много файлов отчетов для конвертирования и подходящей версии WPF, и нет времени для его изменения.

Я не в состоянии предоставить образцы кода, так что я тянуться за любые мысли или предыдущего опыта с таким сценарием в случае, если есть что-то я пропустил.

+0

Я тоже столкнулся с этим - хотел бы услышать объяснение. – Jake

ответ

2

У меня была аналогичная проблема некоторое время назад. Я вижу, что я вызываю Dispatcher.InvokeShutdown (после тестирования, что содержимое элемента управления не является нулевым) в обработчике событий моего главного окна Window_Closing и, похоже, напоминает, что это решение.

Смежные вопросы