2009-09-18 11 views
0

J'ai créé un outil qui importe une feuille Excel. L'objet COM Excel est créé pendant la durée de vie de l'application. J'ai appliqué le modèle MVP à mon outil afin que VIEW et Presenter séparent l'interface utilisateur et la logique.Impossible de libérer l'objet COM Excel dans .NET

La vue qui est un formulaire WinForm possède une méthode Dispose() héritée de la classe From, qui est redéfinie dans le code Deisgner.

protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
     _presenter.Dispose(); 
    } 

littéralement où Cest insérer mon appel Éliminez o mon présentateur, qui est lui-même un code managé, mais contient encore des objets COM non gérés.

Le présentateur est ensuite essayer de libérer l'objet COM en faisant ceci:

public void Dispose() 
    { 
     Int32 countDown = 1; 
     while (countDown > 0) 
      countDown = Marshal.ReleaseComObject(_excelObj); 
    } 

Si j'ouvre l'application sans rien importer, le processus Excel disparaît après la fermeture de l'application Teh. Sinon, si l'application est utilisée pour importer une feuille, l'objet Excel ne lâche plus et reste en mémoire, même après que le travail a été exécuté ou annulé avec succès.

J'ai trouvé un bon lien qui m'a aidé plus loin, mais le problème reste encore: How do I ensure that objects are disposed of properly in .NET?

Merci pour l'aide,

+0

Je ne connais pas suffisamment de détails pour publier une réponse, mais le modèle d'objet Excel n'a-t-il pas quelque part une méthode Quit? Je crois me souvenir du modèle d'objet de Word, et que vous avez dû appeler explicitement pour le déchargement du serveur. –

Répondre

3

Essayez d'utiliser FinalReleaseComObject au lieu de ReleaseComObject. Notez que FinalReleaseComObject n'aura pas besoin d'être utilisé dans une boucle comme le fait ReleaseComObject.

Pour une explication plus détaillée, jetez un oeil à this reply à une autre question car il y a probablement d'autres objets Excel que vous pouvez effacer pour vous assurer que les références ne sont pas conservées. Toute cette question est utile, mais le poste lié en particulier devrait résumer les choses.

+0

Ahhh c'est exactement ce que je cherchais! Merci! –

-1

J'ai eu les mêmes problèmes avant lorsque vous travaillez avec des objets COM Excel. Ce que vous devrez faire dans votre application est dans votre méthode Dispose, en particulier vérifier si le processus Excel est en cours d'exécution et le tuer manuellement.

Assurez-vous simplement que les modifications que vous avez apportées ont été enregistrées en premier.

+0

Le danger est ici, et si une autre feuille Excel non liée à la mienne est déjà ouverte? Ensuite, je voudrais tuer le mauvais processus par erreur et perdre des données. – Houman