Подтвердить что ты не робот

Надлежащее удаление COM-объектов взаимодействия в С#, особенно в приложениях MS Office

Я разрабатываю приложение, которое в значительной степени опирается на несколько продуктов Microsoft Office, включая Access, Excel, Word, PowerPoint и Outlook. Проводя исследование interop, я узнал, что, начиная с VS2010 и .NET 4, мы, к счастью, больше не должны проходить через кошмары PIA.

Кроме того, я читал много статей о правильной утилизации объектов, наиболее разумным, казалось, было this one.

Однако, статья 5 лет, и не так много авторитетных публикаций по теме AFAIK. Вот пример кода из приведенной выше ссылки:

' Cleanup:
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()

Marshal.FinalReleaseComObject(worksheet)

oWB.Close(SaveChanges:=False)
Marshal.FinalReleaseComObject(workbook)

oApp.Quit()
Marshal.FinalReleaseComObject(application)

То, что я хочу знать, - это сегодняшние стандарты, насколько это точно и на что я должен обратить внимание, если я ожидаю поддержки своего приложения в ближайшие несколько лет?

ОБНОВЛЕНИЕ: Приветствуется ссылка на некоторые достоверные статьи. Кстати, это не приложение на стороне сервера. Это будет работать в компьютерных лабораториях, где мы будем взаимодействовать с офисными продуктами, которые мы им создаем.

НАЙДЕНО: Эта статья из трех статей, вероятно, наиболее близка к авторитетной учетной записи, которую я бы ожидал найти.

4b9b3361

Ответ 1

В зависимости от версии Office, которую вы контролируете посредством взаимодействия, и обстоятельств, которые происходят на сервере, да, вам может потребоваться сделать некоторые серьезные свертки, чтобы избавиться от работающего экземпляра одного из приложений Office. Существуют непредсказуемые (и ненужные) диалоги, которые, например, Word откроются, когда он не является интерактивным (ни один из приложений Office не особенно хорошо разработан для автоматического выполнения, поэтому рекомендуется, чтобы даже с последними версиями, которые они не были установлены для на стороне сервера).

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

Ответ 3

Если вы хотите полностью удалить COM-объекты, особенно в COM-объектах MS Office, очень рекомендуется, чтобы вы освобождали вспомогательные объекты, которые вы должны были использовать, которые находятся внутри родительских объектов.

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