В любом смешанном нативном / управляемом процессе существует смесь использования нативной / управляемой памяти. Если между ними нет контролируемых GC отношений, то в этом API не будет необходимости. Например, если в управляемом коде имеются определенные детерминированные изменения состояния, которые приводят к выделению и освобождению собственной памяти, то ничто из того, что может сделать GC, никогда не приведет к освобождению собственной памяти.
Однако очень часто в собственных управляемых объектах, содержащих финализаторы, имеется собственная память. Таким образом, GC может уменьшить размер собственной кучи, просто запустив коллекцию и запустив эти финализаторы.
Поэтому, если у вас много такого происходит, вполне может быть необходимо вызвать этот API (как сказано в документации).
Что касается того, сколько вы должны сказать, это, вероятно, не то, на что вы можете придумать ответ с помощью чистого анализа, особенно с помощью сторонней библиотеки. Вам нужно запустить Performance Monitor, запустить тест, который выделяет много сторонних объектов, и посмотреть на счетчики памяти собственных байтов и CLR, чтобы увидеть, как они связаны.
Поскольку вы используете COM-объект, вы фактически можете принудительно принудительно очищать экземпляры, когда знаете, что они вам больше не нужны, используя Marshal.ReleaseComObject . Обратите внимание, что вам нужно использовать тупой цикл, чтобы избавиться от объекта:
while (Marshal.ReleaseComObject(obj) != 0)
{
}