Как выпустить объект Excel с интерфейсом IDisposeable - PullRequest
2 голосов
/ 19 января 2010

Я пишу класс Excel и хочу автоматически освободить этот неуправляемый объект. Я использую шаблон IDisposable и пишу методы Dispose. Пример;

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);
    }
}

Но у меня есть классическая ошибка на exc.Quit (). Msgstr "COM-объект, который был отделён от лежащего в его основе RCW". Есть ли моя ошибка в коде?

1 Ответ

2 голосов
/ 19 января 2010

Как объясняется в моем ответе на другой связанный с вами вопрос здесь , вы не должны предпринимать действия по ссылочным типам из своего финализатора. Вы реализуете это, используя параметр bool disposing вашего Disposed(bool) метода, как вы это сделали. Вы передаете true, когда Disposed(bool) вызывается явно из метода void Dispose(), и передаете false при вызове из финализатора, что вы также сделали.

Однако вам также необходимо защитить свой вызов на excel.Quit(), чтобы он вызывался , а не , когда Disposed(bool) вызывается через финализатор. То есть вы должны вызывать excel.Quit() только тогда, когда аргумент bool disposing равен true.

Следовательно, код вашего Disposed(bool) метода должен выглядеть следующим образом:

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

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

        disposed = true;
    }
}

После этого вы можете использовать свой класс "MSExcel" следующим образом:

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

Делая это таким образом, когда ваш код попадает в закрывающую скобку "}" вашего блока using оператор , метод Dispose для вашего класса 'MSExcel' будет вызываться автоматически, гарантируя excel.Quit() вызывается детерминистически, а не из финализатора.

Надеюсь, это поможет ...

Mike

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...