Как принудительно освободить объект COM-сервера из C # .NET - PullRequest
0 голосов
/ 21 октября 2010

Могу ли я узнать, как принудительно освободить объект COM-сервера из C # .NET в случае сбоя определенного условия или частичного создания объекта?

Проблема в том, что я использую этот COM-сервер с использованием механизма DCOM;в худшем случае, когда объект не создан полностью, и я вышел из приложения после сбоя, COM-объект все еще находится в памяти (показано в службах компонента приложения COM +).Если он выходит за некоторые пределы, это приводит к утечке памяти и падению.Но если его количество сбоев поддается управлению, его удаляют через некоторое время.

Пример: - Calculator.App objApp = new Calculator.App ();

if (! Obj.CanBeUsed()) {// как освободить COM-объект objApp}

Примечание. Существует метод GC.Collect (), используемый Garbase Collector для принудительного удаления из памяти кучи.Могу ли я использовать этот метод или .NET franework дает какое-либо другое решение для этого конкретного случая?

Ответы [ 2 ]

2 голосов
/ 21 октября 2010

Как это:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp);
1 голос
/ 21 октября 2010

Вы должны попробовать метод Marshal.FinalReleaseComObject.

Метод FinalReleaseComObject освобождает управляемую ссылку на объект COM.Вызов этого метода эквивалентен вызову метода ReleaseComObject в цикле, пока он не вернет 0 (ноль).

Когда счетчик ссылок на COM-объект становится равным 0, COM-объект обычно освобождается, хотя это зависит отРеализация COM-объекта и находится вне контроля среды выполнения.Однако RCW все еще может существовать, ожидая сбора мусора.

COM-объект нельзя использовать после того, как он отделен от своего базового RCW.Если вы попытаетесь вызвать метод в RCW после того, как его счетчик ссылок станет равным 0, будет выдано исключение InvalidComObjectException.

...