Очистка COM-объекта - PullRequest
       17

Очистка COM-объекта

3 голосов
/ 13 ноября 2010

Я создаю экземпляр COM-объекта из сценария VBA в Excel, как это определено в C # DLL. Класс C #, который я создаю, имеет финализатор, который выполняет сборку мусора, особенно другие объекты MS Office, на которые он ссылается, которые, как я должен видеть, появляются и исчезают в диспетчере задач. Фактически, модульные тесты демонстрируют, что процесс Office появляется при вызове dll, и исчезает, когда он завершается.

Когда dll вызывается из VBA, я заметил, что процессы остаются открытыми после завершения функции VBA, то есть объект не очищается после вызова, что приводит меня к мысли, что VBA не освобождает объект COM.

Моя функция выглядит примерно так:

Function Raz(inp As String)
 Dim o: Set o = CreateObject("foo.bar")
 o.InputFields.FirstInput = inp
 o.Update
 Raz = o.OutputFields.FirstOutput
End Function

Я добавил следующую строку в конце функции для решения проблемы:

set o = Nothing

Однако ресурсы в моем процессе COM остаются после выполнения и завершения моего VBA-сценария. Как собрать мусор из COM-объектов из VBA, не создавая вручную вызов dispose?

Ответы [ 3 ]

4 голосов
/ 14 декабря 2010

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

Теория заключается в том, что создание процесса очень медленноеи дорого, и вы можете непреднамеренно написать цикл или что-то, что делает это:

 While 1=1

      Set a = CreateObject(...)
      ' Later
      Set a = Nothing

 Wend

Вы бы не хотели, чтобы Windows безостановочно копала и запускала процессы в цикле бесконечно.

В конце концов ониуходи.

1 голос
/ 31 января 2012

У вас есть слабая ссылка на созданный объект, Raz возвращаемое значение функции, которая поддерживает экземпляр объекта.

Переменная o является автоматической, и для объекта, на который ссылаются, автоматически возвращается значение «ничего», когда функция возвращается, но вы присваиваете значение Raz и, возможно, клиентскому коду, чтобы экземплярное значение не располагалось при возврате функции.

Кроме того, если объект, как это происходит, ссылается на пользовательский элемент управления, вы, вероятно, не сможете выгрузить пользовательскую форму , содержащую его.

1 голос
/ 15 ноября 2010

В VBA команда для освобождения объекта -

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