Не удается освободить COM-объект Excel в .NET - PullRequest
0 голосов
/ 18 сентября 2009

Я создал инструмент, который импортирует лист Excel. COM-объект Excel создается во время жизни приложения. Я применил шаблон MVP к своему инструменту, чтобы VIEW и Presenter разделяли пользовательский интерфейс и логику.

vIEW, который является WinForm, имеет наследуемое наследование метода Dispose () от класса From, который переопределяется в коде Deisgner.

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

Это буквально, куда я вставляю свой вызов dispose моего докладчика, который сам по себе является управляемым кодом, но все же содержит неуправляемые объекты COM.

Затем докладчик пытается освободить COM-объект следующим образом:

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

Если я открою приложение, ничего не импортировав, процесс Excel исчезнет после закрытия приложения. Иначе, если приложение используется для импорта листа, объект excel больше не отпускается и остается в памяти., Даже если задание успешно выполнено или отменено.

Я нашел хорошую ссылку, которая помогла мне в дальнейшем, но проблема все еще остается: Как обеспечить правильную утилизацию объектов в .NET?

Спасибо за помощь,

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Попробуйте использовать FinalReleaseComObject вместо ReleaseComObject. Обратите внимание, что FinalReleaseComObject не нужно будет использовать в цикле, как это делает ReleaseComObject.

Для более подробного объяснения взгляните на этот ответ на другой вопрос, поскольку, вероятно, есть другие объекты Excel, которые вы можете очистить, чтобы убедиться, что ссылки не хранятся. Весь этот вопрос полезен, но, в частности, связанный пост должен подвести итог.

0 голосов
/ 18 сентября 2009

У меня раньше были такие же проблемы при работе с объектами Excel COM. То, что вам нужно будет сделать в вашем приложении, - это метод Dispose, особенно проверьте, запущен ли процесс Excel, и уничтожьте его вручную.

Просто убедитесь, что все сделанные вами изменения были сохранены первыми.

...