Нужно ли вызывать Marshal.ReleaseComObject в C # 4 при выполнении COM? - PullRequest
3 голосов
/ 07 июля 2011

У меня VS2010 и я добавил ссылку на библиотеку COM в мой проект, а VS встроил основное взаимодействие внутри проекта.

Если я ссылаюсь на объекты из библиотеки COM и хочу быстро их утилизировать, не дожидаясь GC, нужно ли вызывать ReleaseComObject?

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Marshal.ReleaseComObject предоставляет способ немедленно отбрасывать ссылки на этот COM-объект везде, где он используется в управляемом коде (поскольку он освобождает базовый IUnknown из RCW, который его удерживает).

Как отмечает Ханс, в общем случае правильным решением является просто обнулить ваш объект, чтобы CLR и GC могли уничтожить COM-объект в соответствующее время.

Однако, в ситуациях, когда вам необходимо немедленное действие (COM-объект содержит дорогие / дефицитные ресурсы или, возможно, во время выключения, когда последовательность очень сложна), вызов ReleaseComObject может быть правильным решением.1006 * Martyn

0 голосов
/ 30 октября 2014

Существует два типа подходов с точки зрения очистки памяти.

  • Алгоритмы подсчета ссылок
  • Сборка мусора

COM-компоненты используют алгоритм подсчета ссылок для восстановления памяти. Всякий раз, когда вам не нужна ссылка на ком-компонент, вы можете вызвать его. Но обычно мой подход заключается в создании виртуального стека и удалении ссылок, таких как исходный код ниже в C #. .NET гарантирует, что RCW жив, а COM-компоненты живы. Когда RCW является сборщиком мусора, вызывается метод освобождения. Не обязательно вызывать релиз в вашем коде. Но это не влияет на циклы gc.

void DoSth
{
       {
            RunTimeCallableWrapper area for the code
            ReleaseComObject
       }  
 }
...