2010-01-13 24 views
4

Je travaille sur une application WPF qui utilise System.AddIn pour résoudre un problème de fuite de mémoire que nous avions avec un contrôle basé sur Windows Forms qui était enveloppé dans un contrôle WindowsFormsHost. Le complément est utilisé pour charger et décharger le contrôle basé sur Windows Forms afin d'éviter le surdébit de WindowsFormsHost, qui restera jusqu'à ce que l'application se ferme dans la version actuelle de WPF et une fuite de mémoire dans le contrôle Windows Forms en raison de mauvaise logique de nettoyage. Le problème auquel nous sommes confrontés est qu'après avoir chargé et déchargé le complément dans l'application, l'application WPF lancera une exception Win32 de "handle de fenêtre invalide" à la sortie de l'application. Cela ne devrait normalement pas être une préoccupation terrible, mais même s'il est possible d'intercepter l'exception, cela n'empêche pas Windows de voir l'application comme écrasée et d'afficher une fenêtre de crash sous Windows 7, ce qui est inacceptable."Invalid Window Handle" à la sortie de l'application WPF qui utilise System.AddIn

En ce qui concerne le code des faits pertinents sont les suivants:

  1. L'exception se produit uniquement si le complément est chargé et déchargé par l'application hôte WPF. Nous éliminons le contrôle WindowsFormsHost et le contrôle basé sur Windows Forms dans le complément dans le cadre d'une méthode Dispose personnalisée appelée avant le déchargement du complément. Le complément interrompt ses Dispatchers avant de décharger (dans le cadre du processus de mise au rebut ci-dessus) qui ont été signalés dans la documentation MSDN et les posts de blog et de résoudre également ce problème qui ne s'est pas produit dans ce cas. Nous n'avons pas le choix d'utiliser le contrôle basé sur Windows Forms comme cela est nécessaire pour certains rapports, et il y a trop de fichiers de rapport à convertir et pas de version WPF appropriée et pas le temps de le changer.

Je ne suis pas en mesure de fournir des échantillons de code, donc je suis atteins pour des pensées ou des expériences antérieures avec un tel scénario dans le cas où il y a quelque chose que j'ai raté.

+0

J'ai déjà rencontré cela - j'aimerais entendre une explication. – Jake

Répondre

2

J'ai eu un problème similaire en arrière. Je vois que j'appelle Dispatcher.InvokeShutdown (après avoir testé que le contenu du contrôle n'est pas nul) dans le gestionnaire d'événements Window_Closing de ma fenêtre principale, et semble me rappeler que c'était la solution.