2010-09-10 28 views
0

je reçois un InvalidComObjectException après que je ferme ma demande dans le morceau de code suivant:InvalidComObjectException lors de l'utilisation d'Excel Interop

class MyExcelManager 
{ 
    myExelAppInstance = new Excel.Application(); 

    // finalizer 
    ~MyExcelManager() 
    { 
    myExelAppInstance.Quit(); // InvalidComObjectException thrown here 
    myExelAppInstance = null; 
    } 
} 

Pourquoi? Ne devrais-je pas utiliser les finaliseurs pour disposer des objets COM?

Répondre

1

Les finaliseurs ne disposent pas d'objets. L'interface Excel.Application n'a pas de méthode Dispose quand même. Le problème est que le finaliseur pour le RCW a déjà été exécuté au moment de l'exécution de votre finaliseur. C'est par conception, l'ordre des finaliseurs n'est pas déterministe.

Excel se ferme automatiquement lorsque toutes les interfaces en attente sont libérées. Ce qui est fait par les finaliseurs pour les RCW. Ne t'aide pas. Si vous voulez aider de toute façon puis écrire comme ceci:

class MyExcelManager : IDisposable 
{ 
    void Dispose() 
    { 
    myExelAppInstance.Quit(); 
    } 
} 

Le client de votre classe doit appeler cette méthode Dispose().