Вы теряете тонну COM-объектов, поэтому.
wb = excel.Workbooks.Open("path")
Это приводит к утечке объекта Workbooks
.
wb.Sheets("Summary").Cells(2, 18).Value = something
Это приводит к утечке Sheets
коллекцииобъект, объект Worksheet
, извлеченный из него, и объект Range
, полученный из этого вызова Cells
.
wb.Sheets("Summary").Shapes("Down Arrow 3").Copy()
Опять утечка коллекции Sheets
, извлеченный экземпляр Worksheet
,коллекция Shapes
и извлеченный объект Shape
.
Это взаимодействие между COM и .NET: вы не находитесь здесь на VBA, вы также не в процессе.
Вы не можете связывать вызовы участников как это.Вам нужно хранить ссылку на каждый COM-объект, к которому вы обращаетесь, и правильно освобождать его.
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb)
Это рабочая книга, ... но теперь существуют вызываемые оболочки во время выполнения (RCW), отключенные от базового COM-объекта.объект, задерживающийся в управляемой памяти - , что - это то, что поддерживает процесс EXCEL.EXE: эти COM-объекты больше недоступны, и их нечего освобождать.
Разделить связанный элементзвонки.
Dim wbSheets As Microsoft.Office.Interop.Excel.Worksheets = wb.Sheets
Dim summarySheet As Microsoft.Office.Interop.Excel.Worksheet =wbSheets("Summary")
'...
Затем отпустите их также:
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbSheets)
System.Runtime.InteropServices.Marshal.ReleaseComObject(summarySheet)
'...
Для все они .Тогда процесс должен завершиться чисто.