CLR создает исполняемую вызываемую оболочку (RCW) для объектов COM, которые вы хотите создать. Это своего рода прокси взаимодействия между .NET и системой COM. Поэтому созданный вами COM-объект выделяется, и в CLR создается ссылка на него, которая помещает его в кучу.
Вы всегда должны реализовывать IDisposable
в классе, который содержит ссылки на RCW, потому что они не очищаются автоматически (оболочки находятся в куче .NET, а сами COM-объекты - нет). Вызов Dispose()
для оболочки освобождает COM-объекты. Не реализация IDisposable
поэтому вызывает утечки памяти.