Вопрос:
Я хочу задать вопрос в ответ на Ответ Майка Розенблюма на на этот вопрос . Речь шла об очистке объектов взаимодействия Excel. Было предложено несколько решений (например, обертки, не использующие более одной точки, убивающие процесс Excel), но мне больше всего понравилось решение Майка Розенблюма этой проблемы ( длинная статья о теме ).
В сущности, это говорит о том, что вы не слишком беспокоитесь обо всех ссылках, которые вы видите. Вы просто оставляете некоторые основные (например, ApplicationClass
, Workbook
и Worksheet
). Сначала вы вызываете сборщик мусора, чтобы очистить все объекты, которые плавают вокруг, а затем явно очистите все основные ссылки, которые у вас есть, вызвав Marshal.FinalReleaseComObject
(в обратном порядке важности).
Теперь у меня есть два вопроса по этому поводу.
Первый: как определить, на какие объекты мне нужно ссылаться? В примере Майка Розенблюма он сохраняет только Ranges
, Worksheets
, Workbooks
и ApplicationClasses
.
Второе: если есть еще объекты, как определить порядок их очистки (т. Е. «Порядок важности»)?
Заранее спасибо.
Обновление 1:
MattC
предполагает, что для заказа важно только то, что приложение выпущено последним. Хотя в моей ссылке есть следующее предложение: «Вы также должны выпустить свои именованные ссылки в обратном порядке важности: сначала выберите объекты диапазона, затем рабочие листы, рабочие книги и, наконец, ваш объект приложения Excel». подразумевает, что есть больше порядка.
nobugz
Предполагает, что достаточно установить все на null
, а затем выполнить сборку мусора, но это, кажется, противоречит следующей цитате из статьи Майка Розенблюма : «Тогда вы бы подумали, что вы можно установить все ваши переменные = Nothing
, а затем вызвать GC.Collect()
в конце, и иногда это работает. Однако приложения Microsoft Office чувствительны к порядку, в котором объекты освобождаются, и, к сожалению, устанавливают ваши переменные = Nothing
, а затем вызов GC.Collect()
не гарантирует порядок высвобождения объектов. "
Обновление 2:
Дополнительная информация:
В моем собственном приложении я много чего делаю с помощью графика. Я устанавливаю много свойств и т. Д. Как я понимаю, во многих местах я создаю новые COM-объекты. Я пытался убедиться, что никогда не использую двойные точки, и я пытался вызвать Marshal.FinalReleaseComObject
для всех объектов, с которыми я закончил. Я не использовал подход обертки, потому что он привнес бы много вложенности.
EXCEL.exe
не закрывалось после завершения работы моего приложения. Но ... он закрылся, когда я сказал своему приложению сделать ту же работу снова. Конечно, открылся новый EXCEL.exe
, который не закрылся. Теперь я удалил все вызовы Marshal.FinalReleaseComObject
и приложение работает точно так же. EXCEL.exe
остается, пока я не скажу моему приложению повторить работу, но затем запускается и остается новый EXCEL.exe
.
РЕДАКТИРОВАТЬ: Кроме того, когда я говорю моему приложению, чтобы сделать другую работу, не связанную с COM, через некоторое время EXCEL.exe
исчезает, но теперь не появляется новый EXCEL.exe
.
Не уверен, какие выводы я могу сделать из этого ...