2 votes

Comment libérer un objet excel avec l'interface IDisposeable ?

Je suis en train d'écrire une classe Excel et je veux libérer cet objet non géré automatiquement. J'utilise le modèle IDisposable et j'écris des méthodes Dispose. Exemple ;

class MSExcel : IDisposable
{
    ApplicationClass excel;
    bool disposed;

    public MSExcel()
    {
         disposed = false;
         excel = new ApplicationClass();
    }

    public void Dispose(bool disposing)
    {
        if (!this.disposed)
        {

            if (disposing)
            {

            }

            excel.Quit();                
            disposed = true;

        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~MSExcel()
    {
       Dispose(false);
    }
}

Mais j'ai une erreur classique sur exc.Quit(). "COM object that has been separated from its underlying RCW". Est-ce qu'il y a une erreur dans le code ?

2voto

Mike Rosenblum Points 7063

Comme je l'ai expliqué dans ma réponse à votre autre question connexe aquí vous ne devez pas agir sur les types de référence à partir de votre finaliseur. Vous pouvez faire respecter cette règle en utilisant la méthode bool disposing de votre Disposed(bool) comme vous l'avez fait. Vous passez dans true , lorsque Disposed(bool) est appelé explicitement à partir de l'élément void Dispose() et de passer la méthode false lorsqu'il est appelé depuis votre finaliseur, ce que vous avez également fait.

Cependant, vous devez également protéger votre appel à excel.Quit() de manière à ce qu'il soit no appelé lorsque Disposed(bool) est appelé par le finaliseur. En d'autres termes, vous ne devez appeler que excel.Quit() lorsque le bool disposing L'argument est true .

Par conséquent, le code de votre Disposed(bool) devrait se présenter comme suit :

public void Dispose(bool disposing)
{
    if (!this.disposed)
    {

        if (disposing)
        {
            excel.Quit();   
        }

        disposed = true;
    }
}

Une fois cela fait, vous pouvez utiliser votre classe "MSExcel" comme suit :

using (MSExcel msExcel = new MSExcel)
{
   // The code calling your 'MSExcel' object goes here.
}

En procédant de cette manière, lorsque votre code arrive au crochet de fermeture, "}", de votre utiliser la déclaration la méthode Dispose de votre classe "MSExcel" sera appelée automatiquement, garantissant ainsi que excel.Quit() est appelé de manière déterministe, et non à partir d'un finalisateur.

J'espère que cela vous aidera...

Mike

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X